You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ggplot绘制多线图跳过NA值并通过grid.arrange组合图表求助

R ggplot折线NA断裂与多图组合问题修复

核心问题原因

  1. 你执行的gather+na.omit数据清洗操作没有赋值给变量,后续绘图使用的仍然是带NA的原始数据集,所以NA过滤完全没有生效
  2. 宽格式数据下绘制多条折线时,geom_lineh不会自动过滤当前映射x列的NA值,NA行打断了折线的连续性
  3. 组合图表时重复调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:15:01