具有频率数据的两个条件的堆叠条形图

Stacked Barplot by two conditions with frequency data

我是 R 的新手,正在尝试创建一个包含频率数据的堆叠 barplot。抱歉,如果之前有人问过类似的问题,但我想不通!

示例数据:

          burn dist perc_bg perc_moss perc_litter
 Site 1   b     0   0.6      0.4      0.0
 Site 1   b     3   0.2      0.7      0.1
 Site 1   b    10   0.3      0.4      0.3
 Site 2   u     0   0.7      0.2      0.1
 Site 2   u     3   0.4      0.3      0.3 
 Site 2   u    10   0.1      0.2      0.7
 Site 3   b     0   0.2      0.4      0.4
 Site 3   b     3   0.3      0.6      0.1
 Site 3   b    10   0.2      0.3      0.5
 Site 4   u     0   0.7      0.2      0.1
 Site 4   u     3   0.5      0.4      0.1
 Site 4   u    10   0.3      0.2      0.5

我想按距离创建堆积条形图并刻录(3 个堆积图 fill=cover 类型 (perc_bg, perc_moss, perc_litter)0, 3, 10 刻录距离 (b) 和 3 个堆积条未燃烧的 0, 3, 10 距离 (u)。所以我需要为按燃烧区域分组的每个距离计算每种覆盖类型的平均频率,我迷路了。任何帮助将不胜感激。

这是一个 tidyverse 解决方案,我建议访问 link 以获取更多信息。

假设您的数据是一个名为 mydata 的数据框,并且站点位于名为 site 的列中(有关我如何制作数据示例,请参阅问题结尾)。

如果需要,使用 install.packages('tidyverse') 安装软件包并加载:

library(dplyr)
library(tidyr)
library(ggplot2)

现在第一个问题是您的封面类型是 3 列(“宽”格式),而您想要“长”格式 - 一列用于类型,一列用于值。您可以为此使用 tidyr::pivot_longer()

mydata %>% 
  pivot_longer(cols = 4:6, names_to = "cover_type")

运行 并记下结果。请注意使用管道 - %>% - 通过一系列步骤传递数据。

您可能想要删除 perc_ 前缀,并将 dist 转换为类别(R 中的因子),因为条形图具有分类 x 轴。为此使用 dplyr::mutate()

mydata %>% 
  pivot_longer(cols = 4:6, names_to = "cover_type") %>% 
  mutate(cover_type = gsub("perc_", "", cover_type), dist = factor(dist))

再次 运行 并记下结果。

终于可以将数据传给ggplot了。我们想绘制 valuedist,用 cover_type 填充,用 burn 填充小平面(并排分开的图)。使用 position_fill 求和为 1。

mydata %>% 
  pivot_longer(cols = 4:6, names_to = "cover_type") %>% 
  mutate(cover_type = gsub("perc_", "", cover_type), dist = factor(dist)) %>% 
  ggplot(aes(dist, value)) + 
  geom_col(aes(fill = cover_type), position = position_fill()) + 
  facet_wrap(~burn) +
  labs(title = "Cover type by distance and burn")

结果。这只是基础知识,还有很多方法可以自定义情节。

数据:

mydata <- read.table(text = "site burn dist perc_bg perc_moss perc_litter
 'Site 1'   b     0   0.6      0.4      0.0
 'Site 1'   b     3   0.2      0.7      0.1
 'Site 1'   b    10   0.3      0.4      0.3
 'Site 2'   u     0   0.7      0.2      0.1
 'Site 2'   u     3   0.4      0.3      0.3 
 'Site 2'   u    10   0.1      0.2      0.7
 'Site 3'   b     0   0.2      0.4      0.4
 'Site 3'   b     3   0.3      0.6      0.1
 'Site 3'   b    10   0.2      0.3      0.5
 'Site 4'   u     0   0.7      0.2      0.1
 'Site 4'   u     3   0.5      0.4      0.1
 'Site 4'   u    10   0.3      0.2      0.5", header = TRUE)