在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
相关产品推荐
相关产品推荐

