如何在堆叠柱状图上叠加双Y轴温度折线图
解决堆叠柱状图叠加温度折线图的问题
问题分析
你的代码存在几个关键问题导致折线图无法显示:
- 变量名包含空格(
Moving _Status),容易引发语法错误,建议统一改为Moving_Status - 使用
position="fill"会将柱状图Y轴转为0-1的比例范围,温度数据(29-30)远大于这个范围,折线会被压缩到几乎不可见 - 未正确添加次坐标轴来适配温度数据的数值范围,也没有为折线图指定正确的映射关系
修正后的完整代码
首先确保你的数据文件中列名无空格(比如将Moving _status改为Moving_Status),然后使用以下代码:
# 读取数据(统一用read.csv,确保文件路径正确) data <- read.csv("Moving_site.csv") # 加载ggplot2包 library(ggplot2) # 绘制堆叠柱状图 + 温度折线图 ggplot(data, aes(x = Site)) + # 堆叠柱状图:主Y轴对应Frequency,按Moving_Status填充 geom_bar(aes(y = Frequency, fill = Moving_Status), stat = "identity", position = "stack") + # 温度折线图:先按比例缩放温度值适配主Y轴范围,添加折线和数据点 geom_line(aes(y = Temp * (max(data$Frequency)/max(data$Temp))), group = 1, color = "red", linewidth = 1.2) + geom_point(aes(y = Temp * (max(data$Frequency)/max(data$Temp))), color = "red", size = 3) + # 设置主、次Y轴 scale_y_continuous( name = "Frequency", sec.axis = sec_axis(~ . / (max(data$Frequency)/max(data$Temp)), name = "Temperature (°C)") ) + # 样式调整 scale_fill_grey() + ggtitle("Movement with Temperature Trend") + theme( plot.title = element_text(hjust = 0.5), axis.ticks = element_line(color = "red", linewidth = 2), axis.title.y.right = element_text(color = "red"), axis.text.y.right = element_text(color = "red") )
关键说明
- 次坐标轴转换:因为温度和Frequency的数值范围差异大,需要将温度值按比例缩放,使其适配主Y轴的范围,然后在次轴上还原真实温度值
group=1:因为Site是分类变量,折线图需要指定group=1来连接所有站点的温度点- 样式区分:用红色标注温度相关的元素(折线、点、次轴),方便区分两个数据系列
测试用示例数据
如果你的数据读取有问题,可以先使用以下示例数据测试:
# 构造示例数据(和你提供的表格一致) data <- data.frame( Site = c("Site_1", "Site_2", "Site_3"), Frequency = c(34, 45, 55), Moving_Status = c("Totally_Moved", "Partially_Moved", "Totally_Moved"), Temp = c(30, 29, 29.5) )
内容的提问来源于stack exchange,提问作者Hadeer ismail
相关产品推荐
相关产品推荐

