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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:15:40