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

如何用ggplot2创建可变宽度的分组堆叠直方图?

绘制不等宽堆叠归一化频率直方图(R + ggplot2)

核心思路

由于你需要的是预定义不等宽时间区间的堆叠直方图(基于13个样本的时间段),且y轴为已归一化的个体频率,我们用ggplot2的geom_col()实现(而非自动分bin的geom_histogram),核心步骤是数据格式转换+手动指定bin宽度。


1. 数据预处理(关键)

假设你的Excel数据包含以下字段:样本ID、起始日期、结束日期、各物种组的归一化频率值(如Isopoda、Copepods等)。首先将宽格式数据转为ggplot需要的长格式,并计算每个时间区间的宽度(天数)和中点日期(用于x轴定位):

# 加载依赖包
library(tidyverse)
library(lubridate)

# 导入Excel数据(替换为你的文件路径)
df <- read_excel("你的数据文件.xlsx")

# 转换为长格式,计算bin参数
df_long <- df %>%
  # 将物种组列转为长格式
  pivot_longer(
    cols = c(Isopoda, Copepods, Amphipoda), # 替换为你实际的所有物种组列名
    names_to = "物种组",
    values_to = "归一化频率"
  ) %>%
  # 处理日期并计算bin宽度、中点
  mutate(
    起始日期 = as.Date(起始日期),
    结束日期 = as.Date(结束日期),
    bin宽度 = as.numeric(结束日期 - 起始日期), # 每个时间段的天数
    bin中点日期 = 起始日期 + bin宽度/2 # 用于x轴定位的中点
  )

2. 绘制堆叠直方图

用geom_col()指定不等宽的bin,通过fill映射物种组实现堆叠分色:

ggplot(df_long, aes(x = bin中点日期, y = 归一化频率, fill = 物种组)) +
  # 堆叠柱形,width绑定bin宽度(天数)
  geom_col(position = "stack", aes(width = bin宽度)) +
  # 自定义x轴日期格式(匹配你的时间范围:2022-07至2023-06)
  scale_x_date(
    limits = as.Date(c("2022-07-01", "2023-06-29")),
    date_labels = "%b %Y",
    date_breaks = "1 month"
  ) +
  # 自定义颜色(可替换为手动颜色:scale_fill_manual(values = c("红","蓝","绿")))
  scale_fill_brewer(palette = "Set3") +
  # 图表标签
  labs(
    x = "时间",
    y = "个体频率(归一化至面积与天数)",
    fill = "物种组"
  ) +
  # 优化主题
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键说明

  • 不用geom_histogram:因为你是已知固定的13个不等宽时间区间,而非自动统计数据分布,geom_col更适合手动指定bin的场景
  • 不等宽实现:通过width = bin宽度参数,将每个柱形的宽度绑定为对应时间段的天数
  • 堆叠效果:position = "stack"自动将同一bin内的物种组频率堆叠
  • 日期匹配:scale_x_date的limits参数严格匹配你指定的时间范围as.Date(seq(1,365),origin="2022-06-30")

内容的提问来源于stack exchange,提问作者Boh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:24:30