You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在堆叠柱状图上叠加双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:13:15