ggplot2绘制折线图时如何跳过NA值连接缺失值两侧的数据点?
问题描述
我尝试绘制4幅共享y轴的折线图,其中CI-TR对应序列存在缺失值(NA),希望可以跳过该NA值,直接连接其两侧的观测点。
使用的数据集如下(注意右侧CI-TR列存在NA值:
现有代码如下(从csv文件读取对应数据):
# 读取excel文件(和附件的表格内容一致) data <- read_csv("test3.csv", col_types = cols(.default = col_guess()) # 整合年龄和深度数据 plots <- data %>% filter(core_id == "BKM0817") %>% gather(key = param, value = value, -core_id, -Age, -depth) # 重命名图表标题(添加前缀a是为了按预期顺序字母排序) plots %>% mutate(facet_label = fct_recode( param, "delta ^ 13 * C[OM] ~(`‰ V-PDB`)" = "ad13com", "delta ^ 15 * N ~(`‰ AIR`)" = "d15N", "'C/N'" = "C/N", "CI-TR" = "aaCI-TR" )) %>% # 绘制图表 ggplot(aes(y = Age, x = value)) + geom_hline(yintercept = c(10720, 10568, 10620), col = "black", alpha = 0.8, lty = 2) + geom_lineh(colour = "black", size = 0.5) + geom_point(size = 2) + facet_wrap(~facet_label, scales = "free_x", labeller = label_parsed, ncol = 4) + scale_y_reverse(# 左侧y轴参数 name = "年龄 (Cal. yrs BP)", # 右侧次坐标轴参数 sec.axis = sec_axis( trans=~./17.927, name="深度 (cm)") ) + labs(x = NULL, y = "年龄 (Cal. yrs BP)") + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))
解决方案
geom_lineh函数默认遇到NA值时会中断连线,只需要在绘图前过滤掉value列为NA的行即可,修改后的核心代码如下:
plots %>% mutate(facet_label = fct_recode( param, "delta ^ 13 * C[OM] ~(`‰ V-PDB`)" = "ad13com", "delta ^ 15 * N ~(`‰ AIR`)" = "d15N", "'C/N'" = "C/N", "CI-TR" = "aaCI-TR" )) %>% # 新增此行过滤NA值的代码即可,连线会自动跳过空缺连接两侧有效观测点 drop_na(value) %>% ggplot(aes(y = Age, x = value)) + geom_hline(yintercept = c(10720, 10568, 10620), col = "black", alpha = 0.8, lty = 2) + geom_lineh(colour = "black", size = 0.5) + geom_point(size = 2) + facet_wrap(~facet_label, scales = "free_x", labeller = label_parsed, ncol = 4) + scale_y_reverse( name = "年龄 (Cal. yrs BP)", sec.axis = sec_axis( trans=~./17.927, name="深度 (cm)") ) + labs(x = NULL, y = "年龄 (Cal. yrs BP)") + theme(panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))
如果未加载tidyr包,可将drop_na(value)替换为filter(!is.na(value)),效果完全一致。
内容的提问来源于stack exchange,提问作者KyleWeston
相关产品推荐
相关产品推荐

