如何在ggplot2中让geom_point与geom_line通过position_dodge对齐?
ggplot2中position_dodge导致geom_point与geom_line位置不对齐的解决方法
核心问题是点和线的分组依据不一致:geom_point用as.factor(evolution.tem)作为分组来做位置偏移,而geom_line用tag分组,两者的偏移逻辑不匹配,最终导致位置错位。
解决思路
要让点和线完全对齐,必须让两者的position_dodge基于相同的分组变量,同时保证线能正确连接对应的数据点。
修正后的代码
先修正原代码中的两处小问题:
- 移除末尾多余的闭合括号
) - 修正x轴标签的拼写错误(
Assasy改为Assay)
然后统一分组逻辑:
ggplot(data = datae.test, aes(x = as.factor(assay.tem), y = change.fitness)) + # 点和线都基于evolution.tem分组做偏移 geom_point(aes(group = as.factor(evolution.tem)), position = position_dodge(width = 0.3)) + xlab(expression(paste("Assay environment"))) + ylab(expression(paste("Change in fitness"))) + labs(shape = expression("Evolution\nenvironment", degree~"C")) + # 线的group改为interaction(evolution.tem, tag),既保证dodge分组一致,又能正确连接同一tag的点 geom_line(aes(linetype = as.factor(evolution.tem), group = interaction(evolution.tem, tag)), position = position_dodge(width = 0.3)) + theme_classic()
测试数据
assay.tem <- c(19,19,19,19,19,19,19,19,26,26,26,26,26,26,26,26) evolution.tem <- c(19,19,26,26,19,19,26,26,19,19,26,26,19,19,26,26) tag <- c("A19a","A19b","A26a","A26b","B19a","B19b","B26a","B26b","A19a","A19b","A26a","A26b","B19a","B19b","B26a","B26b") change.fitness <- c(0.148000525,0.422677262,0.360426885,0.336559874,0.611094594,0.515070536,0.173537012,0.325389861,0.441893408,0.689221781,0.573697751,0.564322921,0.709060167,0.911127005,0.613946604,0.572489802) datae.test <- data.frame(assay.tem, evolution.tem, tag, change.fitness)
效果说明
修改后,geom_point和geom_line都会基于as.factor(evolution.tem)的分组进行统一的位置偏移,确保点和线完全对齐;同时用interaction(evolution.tem, tag)作为线的分组,保证每条线能正确连接同一个tag在不同测试温度(assay.tem)下的 fitness 数据点。
内容的提问来源于stack exchange,提问作者Scrooge Mike
相关产品推荐
相关产品推荐

