使用频率数据按两个条件堆叠条形图

问题描述

我是 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,10 {1}} 距离未燃烧 (u)。所以我需要按燃烧区分组的每个距离计算每种覆盖类型的平均频率,我迷路了。任何帮助将不胜感激。

解决方法

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

假设您的数据是一个名为 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 填充 facet(并排的单独图)。使用 position_fill 求和为 1。

mydata %>% 
  pivot_longer(cols = 4:6,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")

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

enter image description here

数据:

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)