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

在R的ggplot2中绘制双轴柱状折线图,适配刻度并跳过NA值

解决方案

首先修正数据定义错误,再针对两个问题逐一解决:

1. 修正数据框创建

你的数据定义存在两处错误:

  • length_of_days 需用 c() 包裹元素,而非普通括号
  • R 中缺失值必须用大写 NA,而非 N/A

正确的数据框创建代码:

Date <- c("January", "February", "March", "April", "May", "June")
Number_of_events <- c(2, 4, 15, 1, 1,7)
length_of_days <- c(102, 103, NA, 250, 260, 300)
df <- data.frame(Date, Number_of_events, length_of_days)

2. 解决双y轴数值适配问题

由于两个y轴数值范围差异极大,需先对 length_of_days 做缩放,使其匹配主y轴(Number_of_events)的范围,再通过次y轴的转换函数还原真实数值:

  • 计算缩放系数:取主y轴最大值(15)和次y轴最大值(300)的比值,即 coeff <- max(df$Number_of_events, na.rm=T) / max(df$length_of_days, na.rm=T),此处系数为 0.05
  • 在 geom_line 中使用缩放后的 length_of_days * coeff 作为y值
  • 在 sec_axis 中用 ~./coeff 还原真实数值,确保次y轴显示原始天数

3. 解决折线跳过NA值的问题

只要数据中的缺失值是R标准的 NA,geom_line 会自动跳过该点,不会连接前后数据(你的代码中已添加 group=1,确保折线能跨字符型x轴变量连接,这部分设置正确)

完整代码

library(ggplot2)

# 创建修正后的数据框
Date <- c("January", "February", "March", "April", "May", "June")
Number_of_events <- c(2, 4, 15, 1, 1,7)
length_of_days <- c(102, 103, NA, 250, 260, 300)
df <- data.frame(Date, Number_of_events, length_of_days)

# 计算缩放系数
coeff <- max(df$Number_of_events, na.rm = TRUE) / max(df$length_of_days, na.rm = TRUE)

ggplot(df) +
  # 主y轴柱状图
  geom_bar(aes(x = Date, y = Number_of_events), stat = "identity", fill = "#69b3a2") +
  # 次y轴折线图(已缩放)
  geom_line(aes(x = Date, y = length_of_days * coeff), size = 1.5, color = "#333333", group = 1) +
  # 设置双y轴
  scale_y_continuous(
    name = "Number of Events",
    sec.axis = sec_axis(~./coeff, name = "Length of Days")
  ) +
  labs(x = "Month") +
  theme_minimal()

关键说明

  • 缩放系数确保两个图层的y值范围对齐,避免图表显示异常
  • 标准 NA 会被 geom_line 自动识别并跳过,折线直接连接February和April的点
  • 修正了你原代码中的笔误:length_of_events 改为 length_of_days

内容的提问来源于stack exchange,提问作者DY33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:25:33