【问题标题】:R - Grouped Bar Plot with multi-column dataR - 具有多列数据的分组条形图
【发布时间】:2019-02-25 23:32:15
【问题描述】:

我正在尝试在 R 中创建一个类似于我在 Excel 中生成的图表:

我正在尝试按年份和指数对条形图进行分组,并按我的处理方式分开。我试图以“长格式”将我的数据输入 R 并想出了这个:

          Year          Indices     Means Treatment
1  2015          Shannon  3.062402   Drought
2  2015          Shannon  3.329283   Control
3  2015          Simpson  3.784725   Drought
4  2015          Simpson  4.346054   Control
5  2015 Species Richness  7.833333   Drought
6  2015 Species Richness  8.000000   Control
7  2016          Shannon  3.320377   Drought
8  2016          Shannon  3.496330   Control
9  2016          Simpson  3.877924   Drought
10 2016          Simpson  4.443414   Control
11 2016 Species Richness  9.666667   Drought
12 2016 Species Richness 10.333333   Control
13 2017          Shannon  4.421234   Drought
14 2017          Shannon  4.347877   Control
15 2017          Simpson  7.070072   Drought
16 2017          Simpson  6.340170   Control
17 2017 Species Richness 14.833333   Drought
18 2017 Species Richness 14.833333   Control
19 2018          Shannon  4.055784   Drought
20 2018          Shannon  3.939885   Control
21 2018          Simpson  5.796247   Drought
22 2018          Simpson  5.018261   Control
23 2018 Species Richness 13.500000   Drought
24 2018 Species Richness 14.000000   Control

使用 GGplot 我可以创建一个条形图,其中年份或指数不同时分组。下面按年份分组。这是图表的样子:

ggplot(data,aes(x=Year,y=Means, fill=Treatment),stat="identity",fill=factor(Treatment))+
  geom_bar(stat="identity",position="dodge")

这是按指数分组的图表

.

ggplot(data,aes(x=Indices,y=Means, fill=Treatment),stat="identity",fill=factor(Treatment))+
  geom_bar(stat="identity",position="dodge")

我的问题是,如何创建一个按年份和指数分组的图表,其中不同的条形代表类似于我的 Excel 图表的治疗?我应该以不同的方式重新输入我的数据吗?我试过使用 group_by,但没有运气。

谢谢!

【问题讨论】:

  • 貌似要加分面,比如facet_wrap(~Indices)
  • Camille 的推荐非常棒。您可能还希望 X 值的格式为 yyyy_index,您可以使用 data %>% mutate(y_i=paste(Year, Indices, sep="_") 创建它,然后将其用作 X 轴变量。然后,您可以使用标签函数/annotate 让您的图表看起来正确。感谢您使用有效数字/希尔数字版本的指数 :)

标签: r ggplot2 bar-chart


【解决方案1】:

我倾向于使用facet_wrap()facet_grid() 将多个组放到我的条形图上。

这应该可以创建与您在 Excel 中得到的类似的输出。网格的好处是它在每个网格中平等地缩放 x 和 y 轴。这个可以在facet_grid的选项里调整。

ggplot(x,aes(x=Indices,y=Means, fill=Treatment), 
       stat="identity",
       fill=factor(Treatment)) +
  geom_bar(stat="identity", position="dodge") +
  facet_grid(cols = vars(Year))

facet_grid() 在哪里创建一个网格,您可以在其中指定将网格分组到的列。

我还找到了this solution by Tom Martens,看起来很啰嗦,但可能正是你需要的。

【讨论】:

  • facet_wrap() 和 facet_grid() 都能完美运行。我只需要调整颜色和标签。感谢您快速轻松地修复!
【解决方案2】:

在您询问后我意识到这很好,但我一直在开发一个包来帮助创建这些类型的分组条形图 (ggNestedBarChart)。使用您的示例:

plotDat <- read.table(
  header = TRUE, 
  sep = ",", 
  quote = "", 
  strip.white = TRUE, 
  text =
"Year,          Indices,     Means, Treatment
 2015,          Shannon,  3.062402,   Drought
 2015,          Shannon,  3.329283,   Control
 2015,          Simpson,  3.784725,   Drought
 2015,          Simpson,  4.346054,   Control
 2015, Species Richness,  7.833333,   Drought
 2015, Species Richness,  8.000000,   Control
 2016,          Shannon,  3.320377,   Drought
 2016,          Shannon,  3.496330,   Control
 2016,          Simpson,  3.877924,   Drought
 2016,          Simpson,  4.443414,   Control
 2016, Species Richness,  9.666667,   Drought
 2016, Species Richness, 10.333333,   Control
 2017,          Shannon,  4.421234,   Drought
 2017,          Shannon,  4.347877,   Control
 2017,          Simpson,  7.070072,   Drought
 2017,          Simpson,  6.340170,   Control
 2017, Species Richness, 14.833333,   Drought
 2017, Species Richness, 14.833333,   Control
 2018,          Shannon,  4.055784,   Drought
 2018,          Shannon,  3.939885,   Control
 2018,          Simpson,  5.796247,   Drought
 2018,          Simpson,  5.018261,   Control
 2018, Species Richness, 13.500000,   Drought
 2018, Species Richness, 14.000000,   Control")

devtools::install_github("davedgd/ggNestedBarChart")
library(ggNestedBarChart)

p1 <- ggplot(plotDat, aes(x = Treatment, y = Means, fill = Treatment), stat = "identity") +
  geom_bar(stat = "identity") +
  facet_wrap(vars(Year, Indices), strip.position = "top", scales = "free_x", nrow = 1) +
  theme_bw(base_size = 13) +
  theme(panel.spacing = unit(0, "lines"),
        strip.background = element_rect(color = "black", size = 0, fill = "grey92"),
        strip.placement = "outside",
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_line(colour = "grey"),
        panel.border = element_rect(color = "black", fill = NA, size = 0),
        panel.background = element_rect(fill = "white")) + 
  scale_y_continuous(expand = expand_scale(mult = c(0, .1))) +
  labs(x = "")

ggNestedBarChart(p1)

ggsave("p1.png", width = 18, height = 5)

请注意,相对于仅调用 p1,ggNestedBarChart 是情节分面条的样式(例如,顶部条中的分组年份)。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多