使用ggplot绘制多线图跳过NA值并通过grid.arrange组合图表求助
R ggplot折线NA断裂与多图组合问题修复
核心问题原因
- 你执行的
gather+na.omit数据清洗操作没有赋值给变量,后续绘图使用的仍然是带NA的原始数据集,所以NA过滤完全没有生效 - 宽格式数据下绘制多条折线时,
geom_lineh不会自动过滤当前映射x列的NA值,NA行打断了折线的连续性 - 组合图表时重复调用
scale_y_reverse会覆盖之前的轴配置,属于冗余代码
修复方案
方案1:保持现有宽数据绘图逻辑(无需gather)
每个折线图层单独传入过滤了对应x列NA的数据集,同时删除冗余的轴设置即可,修改后完整代码如下:
theme_set(theme_paleo(8)) theme_update(plot.title = element_text(hjust = 0.5)) # 读取数据 data <- read_csv("profundal.csv", col_types = cols(.default = col_guess())) # 先过滤目标样本,存入新变量 clean_data <- data %>% filter(core_id == "BKM0817") # 绘制第一张图,每个图层单独过滤对应指标的NA prof1 <- ggplot() + geom_lineh(data = filter(clean_data, !is.na(ad13com)), mapping = aes(x=ad13com, y = Age), colour = "black", size = 1) + geom_point(data = filter(clean_data, !is.na(ad13com)), mapping = aes(x=ad13com, y = Age), colour = "black", size = 2) + geom_lineh(data = filter(clean_data, !is.na(Pd13c)), mapping = aes(x=Pd13c, y = Age), linetype = 2, colour = "black", size = 1) + geom_point(data = filter(clean_data, !is.na(Pd13c)), mapping = aes(x=Pd13c, y = Age), shape=0, colour = "black", size = 2.7) + scale_y_reverse() + labs (x = expression(delta ^13*"C (\u2030 V-PDB)"), y = "Age (Cal. yrs BP)") + ggtitle(expression(delta ^13*"C"[OM]~"and Chironomus")) + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) # 绘制第二张图,过滤xPDd13C的NA prof2 <- ggplot() + geom_lineh(data = filter(clean_data, !is.na(xPDd13C)), mapping = aes(x=xPDd13C, y = Age), colour = "black", size = 1) + geom_point(data = filter(clean_data, !is.na(xPDd13C)), mapping = aes(x=xPDd13C, y = Age), shape = 2, colour = "black", size = 2) + scale_y_reverse( name = "Age (Cal. yrs BP)", sec.axis = sec_axis( trans=~./17.927, name="Depth (cm)") ) + labs(x = expression(delta ^13*"C (\u2030 V-PDB)"), y = "Age (Cal. yrs BP)") + ggtitle( expression(Delta*delta ^13*"C")) + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) # 组合图表,删除重复的scale_y_reverse配置 profundal <-gridExtra::grid.arrange( prof1, prof2 + labs(y = NULL) + theme( plot.margin = unit(c(0.05,0.1, 0.056,0), "inches"), axis.ticks.y = element_blank(), axis.text.y = element_blank(), plot.background = element_blank() ), nrow = 1, widths = c(4, 4) ) # 保存文件 ggsave("test.png", units="in", width=8, height=6, dpi=300, plot=profundal)
方案2:使用长数据绘图(更简洁)
如果你之前做gather是为了复用逻辑,也可以用长数据的方式一次映射多条折线,不需要重复写geom图层:
# 转长数据并过滤所有NA long_data <- clean_data %>% gather(key = param, value = value, -core_id, -Age, -depth) %>% na.omit() # 第一张图通过映射参数一次生成多条折线 prof1 <- ggplot(long_data %>% filter(param %in% c("ad13com", "Pd13c")), aes(x = value, y = Age, linetype = param, shape = param)) + geom_lineh(size = 1, colour = "black") + geom_point(size = 2, colour = "black") + scale_linetype_manual(values = c("ad13com" = "solid", "Pd13c" = "dashed")) + scale_shape_manual(values = c("ad13com" = 16, "Pd13c" = 0)) + # 剩余轴配置、主题设置和原代码一致 ...
内容的提问来源于stack exchange,提问作者KyleWeston
相关产品推荐
相关产品推荐

