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

R语言实现同图双堆叠bar plot:温度与降水数据可视化需求

在同一绘图区域呈现温度与降水的堆叠柱状图(BIRR市案例)

嗨,作为R语言初学者,你想要把温度和降水的堆叠柱状图放在同一绘图区域,每个月份同时展示两组数据,这个需求很清晰。下面我会一步步带你实现这个效果:

第一步:准备数据并加载工具

首先确保你安装了tidyverse包(它包含了ggplot2和数据处理工具dplyr),如果没安装先运行:

install.packages("tidyverse")

然后加载包:

library(tidyverse)

接下来把你提供的数据集转换成R能识别的数据框(直接用你的数据构建):

# 温度数据集
TEMP_BIRR <- data.frame(
  SOUNAME = rep("BIRR", 16),
  year_month = rep(c("2004-04", "2004-05", "2004-06", "2004-07"), each=4),
  temperature_type = rep(c("VERY_COLD", "MEDIUM", "HOT", "COLD"), 4),
  temperature_value = c(0,0,0,0,28,29,19,25,0,2,11,6,2,0,0,0)
)

# 降水数据集
TEMP_PREC_BIRR <- data.frame(
  SOUNAME = rep("BIRR", 16),
  year_month = rep(c("2004-04", "2004-05", "2004-06", "2004-07"), each=4),
  precipitation_type = rep(c("NONE", "HEAVY", "LIGHT", "MEDIUM"), 4),
  precipitation_value = c(11,20,11,10,2,1,1,1,15,7,16,18,2,3,2,2)
)

为了让ggplot能同时处理两组数据,我们需要把它们转换成统一的长格式,并添加一个标记区分温度/降水:

# 整理温度数据:重命名列并添加分组标记
temp_long <- TEMP_BIRR %>%
  rename(category = temperature_type, days = temperature_value) %>%
  mutate(data_type = "Temperature")

# 整理降水数据:同理操作
prec_long <- TEMP_PREC_BIRR %>%
  rename(category = precipitation_type, days = precipitation_value) %>%
  mutate(data_type = "Precipitation")

# 合并两个数据集
combined_data <- bind_rows(temp_long, prec_long)

第二步:绘制目标图表

现在我们可以用ggplot创建每个月份同时展示温度和降水堆叠柱的图表了。这里用position_dodge让同一月份下的两组堆叠柱并排,同时保持各自的堆叠结构:

ggplot(combined_data, aes(x = year_month, y = days, fill = category)) +
  # 绘制堆叠柱状图,设置宽度并按data_type分组
  geom_bar(
    stat = "identity",
    position = position_stack(), # 组内堆叠
    width = 0.4,
    aes(group = data_type)
  ) +
  position_dodge(width = 0.8) + # 让温度和降水的柱并排
  # 添加标签和标题
  labs(
    x = "Date",
    y = "Number of Days",
    title = "Temperature & Precipitation Trends - BIRR (2004)",
    fill = "Category"
  ) +
  # 自定义颜色,方便区分不同类型(可选但推荐)
  scale_fill_manual(
    values = c(
      "VERY_COLD" = "#003366", "COLD" = "#6699CC",
      "MEDIUM" = "#FF9933", "HOT" = "#CC3300",
      "NONE" = "#999999", "LIGHT" = "#99CC99",
      "MEDIUM" = "#339933", "HEAVY" = "#006600"
    )
  ) +
  # 使用简洁的主题
  theme_minimal()

关键细节说明

  • 不要在aes里写data$column(比如你之前的TEMP_BIRR$year_month),直接用列名就行,ggplot会自动从指定的数据框读取,这样代码更简洁规范。
  • 如果想让两组堆叠柱完全重叠(而不是并排),可以把position_dodge换成position_stack(vjust = 0.5),但重叠后可读性会下降,更推荐并排的方式。
  • 自定义颜色可以让不同的温度/降水类型一目了然,你可以根据自己的喜好调整颜色代码。

内容的提问来源于stack exchange,提问作者Elodie P.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:35