【问题标题】:Stacked Barplot by two conditions with frequency data按两个条件和频率数据堆叠的条形图
【发布时间】:2021-02-03 20:21:45
【问题描述】:

我是 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) 。所以我需要为每个按燃烧区域分组的距离获取每种覆盖类型的平均频率,我迷路了。任何帮助将不胜感激。

【问题讨论】:

    标签: r ggplot2 bar-chart frequency stacked-chart


    【解决方案1】:

    这是一个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 填充刻面(并排分开的图)。使用 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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2023-01-21
      • 2021-02-24
      相关资源
      最近更新 更多