使用ggplot2绘制2001-2010年月度气象数据:曲线不显示及分面需求
解决方案:修复曲线显示问题+实现年份分面+添加mean_rh曲线
可复现模拟数据
先给出和需求匹配的模拟数据,方便你对应自己的数据集:
set.seed(123) # 生成2001-2010年12个月的月度数据 df <- expand.grid(year = 2001:2010, month = 1:12) df$precip <- rnorm(120, 50, 20) # 降水量 df$temp <- rnorm(120, 15, 8) # 气温 df$rh <- rnorm(120, 65, 10) # 相对湿度 df$mean_rh <- 65 # 年度平均相对湿度(若为逐年均值,替换为对应列即可)
曲线未显示的常见原因及修复
- 数据格式不匹配:ggplot2绘制多条曲线时,需要长格式数据(宽格式会导致图层无法正确映射),用
tidyr::pivot_longer()转换气温和湿度列 - 双Y轴映射错误:降水与气温/湿度数值范围差异大,若用双Y轴需做线性缩放,否则曲线会被压缩到图表底部
- 分面语法错误:确保
year是字符/因子类型,分面用facet_wrap(~year)而非错误的分组逻辑
完整实现代码
以下代码实现了按年份分面,同时显示降水柱状图、气温/湿度曲线、mean_rh水平虚线,适配双Y轴:
library(ggplot2) library(tidyr) # 将气温、湿度转换为长格式 df_long <- df %>% pivot_longer(cols = c(temp, rh), names_to = "indicator", values_to = "value") # 绘图 ggplot(df, aes(x = month)) + # 绘制降水量柱状图 geom_col(aes(y = precip), fill = "#4682B4", alpha = 0.7) + # 绘制气温、湿度曲线(缩放后适配左侧Y轴,后续通过双Y轴转换) geom_line(data = df_long, aes(y = value * 0.7, color = indicator), linewidth = 1.1) + # 添加年度平均相对湿度水平线(同样适配缩放比例) geom_hline(aes(yintercept = mean_rh * 0.7), color = "#DC143C", linetype = "dashed", linewidth = 1) + # 双Y轴配置:左侧为降水量,右侧为气温/湿度 scale_y_continuous( name = "月度降水量 (mm)", sec.axis = sec_axis(~./0.7, name = "气温 (°C) / 相对湿度 (%)") ) + # 按年份分面,每行显示2个年份 facet_wrap(~year, ncol = 2) + # 自定义颜色 scale_color_manual(values = c("temp" = "#FFA500", "rh" = "#228B22")) + # 标签与样式调整 labs(x = "月份", color = "指标") + theme_minimal() + theme( axis.title.y.right = element_text(color = "#228B22"), legend.position = "top", strip.text = element_text(size = 10, face = "bold") )
关键细节说明
- 双Y轴缩放比例:
0.7是根据模拟数据的数值范围调整的,你可以根据自己数据的最大值/最小值修改,确保曲线在图表中显示清晰 - mean_rh适配:如果你的
mean_rh是逐年的平均值,直接替换geom_hline中的mean_rh为对应列名即可 - 月份可读性优化:可以将数字月份转为英文缩写:
df$month <- factor(df$month, levels = 1:12, labels = month.abb)
内容的提问来源于stack exchange,提问作者Ahsk
相关产品推荐
相关产品推荐

