R语言绘制数值差异悬殊的双Y轴图表:显示REP标准差及正确刻度
解决双Y轴数值范围差异大的可视化问题
核心思路
不用手动缩小REP数值,而是通过ggplot的双Y轴转换机制,将REP按比例映射到左侧温度轴的范围,同时在右侧显示REP的原始刻度,这样既保留标准差的可视化,也能让右侧轴刻度准确。
具体步骤与代码示例
假设你的数据框名为df,先计算缩放系数:
# 计算温度和REP的范围区间 temp_range <- range(df$minTempAmb_Avg) rep_range <- range(df$REP) # 计算缩放系数:把REP缩放到温度的范围区间内 coeff <- (temp_range[2] - temp_range[1]) / (rep_range[2] - rep_range[1])
然后编写ggplot可视化代码:
library(ggplot2) ggplot(df, aes(x = date)) + # 绘制温度的柱状图(对应左侧Y轴) geom_bar(aes(y = minTempAmb_Avg, fill = "minTempAmb_Avg"), stat = "identity", alpha = 0.7) + # 绘制REP的折线和点(已缩放至左侧轴范围) geom_line(aes(y = REP * coeff, color = "REP"), linewidth = 1) + geom_point(aes(y = REP * coeff, color = "REP"), size = 2) + # 绘制REP的标准差误差线(同步缩放,确保显示正常) geom_errorbar(aes(y = REP * coeff, ymin = (REP - sd_REP) * coeff, ymax = (REP + sd_REP) * coeff), width = 0.2, color = "darkred") + # 设置双Y轴:左侧显示温度,右侧还原REP原始数值 scale_y_continuous( name = "minTempAmb_Avg", sec.axis = sec_axis(~ . / coeff, name = "REP") ) + # 调整图例与主题样式 scale_fill_manual(values = "steelblue") + scale_color_manual(values = "darkred") + labs(x = "Date", fill = "", color = "") + theme_minimal() + theme(legend.position = "top")
关键说明
- 缩放系数
coeff让REP的数值范围刚好匹配温度的范围,避免折线和误差线被压缩或超出图表显示区域。 - 右侧Y轴通过
sec_axis(~ . / coeff)将缩放后的数值还原为REP的原始值,刻度会自动计算,保证准确性。 - 误差线的
ymin和ymax必须同步乘以coeff,才能和缩放后的REP折线对应,正确展示标准差的波动幅度。
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

