如何用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
相关产品推荐
相关产品推荐

