如何用R的ggplot2按样带编号分组绘制物种数量分面条形图?
问题:如何用ggplot2绘制按日期分面、按样带统计物种数量的柱状图
数据情况
用户拥有样带沿线无脊椎动物的计数数据,包含三列:数据采集日期、样带编号(Transect)、观测物种(Species),数据结构如下:
structure(list(Date = c("8/22/2022", "8/22/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/23/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/22/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/18/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022", "8/16/2022"), Transect = c(8L, 8L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 7L, 8L, 8L, 9L, 9L, 9L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 8L, 8L, 9L, 9L, 9L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 9L, 9L, 9L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 6L, 7L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 9L), Species = c("RCRAB", "DOL", "DOL", "STAR", "DOL", "RCRAB", "STAR", "DOL", "LOB", "DOL", "DOL", "RCRAB", "DOL", "LOB", "STAR", "DOL", "LOB", "STAR", "DOL", "RCRAB", "DOL", "RCRAB", "DOL", "DOL", "RCRAB", "DOL", "STAR", "RCRAB", "DOL", "STAR", "RCRAB", "URCH", "DOL", "RCRAB", "URCH", "STAR", "DOL", "LOB", "STAR", "URCH", "DOL", "RCRAB", "STAR", "URCH", "STAR", "DOL", "URCH", "RCRAB", "DOL", "STAR", "URCH", "RCRAB", "DOL", "STAR", "DOL", "LOB", "DOL", "RCRAB", "DOL", "RCRAB", "DOL", "DOL", "STAR", "URCH", "DOL", "STAR", "RCRAB", "LOB", "DOL", "STAR", "RCRAB", "DOL", "LOB", "DOL", "STAR", "LOB", "DOL", "STAR", "URCH", "DOL", "STAR", "RCRAB", "DOL", "LOB", "STAR", "DOL", "DOL", "DOL", "RCRAB", "STAR", "STAR", "DOL", "RCRAB", "DOL", "STAR", "RCRAB")), class = "data.frame", row.names = c(NA, -96L))
需求与问题
用户希望创建分面图:每个日期对应一个子图,X轴为样带编号,Y轴为该样带上的物种数量(个体总数或物种种类数)。
现有代码如下:
library(ggplot2) invertplot <- ggplot(data=invert, aes(Transect, Species)) + geom_bar(stat='identity') + labs(title="Number of Invertebrate Species per Transect Steering Rocks August 2022", y="Number of Species", x="Transect Number") + facet_wrap(~Date) invertplot
但生成的图Y轴显示单个物种,X轴为该物种总数,不符合需求。
解决方案
1. 数据预处理(关键步骤)
原始数据为每行一条观测记录,需先按日期+样带分组,统计目标数值:
- 若统计个体总数:
library(dplyr) library(ggplot2) # 按日期和样带分组,计算个体数量 invert_summary <- invert %>% group_by(Date, Transect) %>% summarise(Individual_Count = n(), .groups = "drop")
- 若统计物种种类数:
invert_summary <- invert %>% group_by(Date, Transect) %>% summarise(Species_Type_Count = n_distinct(Species), .groups = "drop")
2. 绘制分面图
用汇总后的数据绘图,X轴为样带编号,Y轴为统计得到的数量:
# 以个体总数为例绘图 invertplot <- ggplot(data = invert_summary, aes(x = factor(Transect), y = Individual_Count)) + geom_bar(stat = "identity", fill = "#4682B4") + labs(title = "2022年8月Steering Rocks样带无脊椎动物数量统计", y = "个体总数", x = "样带编号") + facet_wrap(~Date, ncol = 2) + # 可指定列数优化布局 theme_bw() invertplot
错误原因说明
原代码将Species(字符型变量)放在Y轴,ggplot默认对字符型变量做频数统计,导致轴的逻辑完全颠倒;同时未对数据按日期和样带分组汇总,无法得到每个样带的整体数量统计结果。
内容的提问来源于stack exchange,提问作者Jordan Woolfrey
相关产品推荐
相关产品推荐

