ggplot散点图存在缺失x值导致趋势线无法连通的问题咨询
问题原因
趋势线出现缺口是因为你的数据中存在缺失采样日对应的观测值,geom_line()默认遇到NA值或者无对应分组观测的时间节点时,会断开连线,不会自动跳过缺失节点连接前后有效数据。
解决方法
方法1:直接修改geom_line参数(适用于缺失日期仅对应TEPcells/SE为NA的场景)
只需在geom_line()层添加na.rm = TRUE参数,即可自动跳过NA值直接连接前后有效数据点,修改后的代码如下:
ggplot(SiExptTEPa, aes(x=Timepoint..dpi., y=TEPcells, group=Treatment)) + geom_point(size=5,aes(colour=Nutrient)) + scale_color_manual(values=c('yellow','light blue')) + geom_errorbar(aes(ymin=TEPcells-se, ymax=TEPcells+se), width=.1) + facet_wrap(~Nutrient, scales="free") + scale_y_continuous(labels = scales::scientific) + theme_classic() + xlab("Time Post Infection (Days)") + ylab("TEP by Total Cells") + ylim(3e-08,2e-07) + geom_line(aes(linetype=Treatment), na.rm = TRUE) + scale_linetype_manual(values=c("solid", "dashed"))
注:如果没有单独加载scales包,需要给scientific函数加上scales::前缀避免报错。
方法2:先补全数据再绘图(适用于缺失日期完全没有对应分组观测行的场景)
如果你的数据集里缺失采样日完全没有对应Treatment+Nutrient组合的行,可以先用tidyr的complete函数补全所有时间节点的分组观测,再绘图即可:
library(dplyr) library(tidyr) # 补全所有时间点、处理、营养条件的组合 SiExptTEPa_full <- SiExptTEPa %>% complete(Timepoint..dpi., Treatment, Nutrient) # 用补全后的数据绘图 ggplot(SiExptTEPa_full, aes(x=Timepoint..dpi., y=TEPcells, group=Treatment)) + geom_point(size=5,aes(colour=Nutrient), na.rm = TRUE) + scale_color_manual(values=c('yellow','light blue')) + geom_errorbar(aes(ymin=TEPcells-se, ymax=TEPcells+se), width=.1, na.rm = TRUE) + facet_wrap(~Nutrient, scales="free") + scale_y_continuous(labels = scales::scientific) + theme_classic() + xlab("Time Post Infection (Days)") + ylab("TEP by Total Cells") + ylim(3e-08,2e-07) + geom_line(aes(linetype=Treatment), na.rm = TRUE) + scale_linetype_manual(values=c("solid", "dashed"))
注意事项
如果缺失的采样数据有实际业务意义,建议在最终图表中标注缺失的时间节点,避免读者误解数据连续性。
内容的提问来源于stack exchange,提问作者Rachel Davitt
相关产品推荐
相关产品推荐

