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

ggplot2绘制折线图时如何跳过NA值连接缺失值两侧的数据点?

问题描述

我尝试绘制4幅共享y轴的折线图,其中CI-TR对应序列存在缺失值(NA),希望可以跳过该NA值,直接连接其两侧的观测点。
Graphs
使用的数据集如下(注意右侧CI-TR列存在NA值:
table of data
现有代码如下(从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:45:02