如何让geom_line()数据在ggplot2双Y轴柱线图中正常显示?
双Y轴图表折线不显示的解决方法
问题分析
你的图表能正常显示湿度数据点,但无法渲染连接点的折线,核心原因是**Datetime列是字符类型**——ggplot会把离散的字符型x轴视为分类变量,即便只有两个类别,也不会自动绘制折线(折线需要连续型的x轴来连接数据点)。另外代码中ylim(0,1)和scale_y_continuous重复设置,会导致轴范围设置冲突。
解决方案
1. 转换日期时间列类型
将Datetime从字符型转为POSIXct格式的时间类型,推荐用lubridate包简化操作(也可以用基础R的as.POSIXct):
# 先安装并加载lubridate(如果没装过) install.packages("lubridate") library(lubridate) # 根据你的实际时间格式调整函数,比如ymd、dmy_hm等 weather_phase1$Datetime <- ymd_hms(weather_phase1$Datetime)
2. 合并Y轴范围设置
把ylim(0,1)整合到scale_y_continuous中,避免重复设置导致的冲突:
scale_y_continuous( name = "Fog (mm)", limits = c(0, 1), # 在这里设置Y轴范围 sec.axis = sec_axis(~.*coeff, name="Humidity (%)") )
修正后的完整代码
library(ggplot2) library(lubridate) # 导入数据集 weather_phase1 <- read.csv("Gobabebmet_phase1.csv", header=TRUE) # 转换Datetime为时间类型 weather_phase1$Datetime <- ymd_hms(weather_phase1$Datetime) # 请根据实际时间格式调整函数 # 数据转换系数 coeff <- 100 p1 <- ggplot(weather_phase1, aes(x=Datetime)) + geom_bar(aes(y=Fog), stat = "identity", fill='#54b8e3') + geom_line(aes(y=Humidity / coeff), color = "#bf5aed") + geom_point(aes(y=Humidity / coeff)) + scale_y_continuous( name = "Fog (mm)", limits = c(0, 1), sec.axis = sec_axis(~.*coeff, name="Humidity (%)") ) + xlab("Time") + theme_bw() + theme( text = element_text(size = 20), panel.grid.major = element_blank(), panel.grid.minor = element_blank() ) p1 + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
内容的提问来源于stack exchange,提问作者Sien Smania
相关产品推荐
相关产品推荐

