如何在ggplot2中使用不同年份的一个分类变量创建条形图?

时间:2019-02-05 00:15:05

标签: r dataframe ggplot2 plot geom-bar

我有一个非常大的数据框,其中第一列的每一行代表一个带有数字的ID。其他行具有类别变量,可以是两种类型(在此示例中为A或B),每种类型为一年。这里以一个简化的数据框为例:

id  var2017  var2018  var2019
1     A        B         A
2     B        A         A
3     B        A         B
4     A        A         A
5     A        B         B

我想创建一个条形图,其中包含每年每种类型(A和B)的计数,条形图按类型分组。 我是R语言的新手,所以我尝试分别创建多年的图表,效果很好,如下所示:

graph <– ggplot(data = example) +
        geom_bar(aes(x = var2017))

问题是我不知道如何将它们放在一起。 如何创建一个图表,其中每年的所有类型都在x轴上,而计数在y轴上? 该ID不必在输出中。

2 个答案:

答案 0 :(得分:2)

在ggplot中绘制多列的方法是首先将数据转换为长格式,这可以使用tidyr::gather完成。然后,将其所属的列(现在存储在“ year”列中)映射到一种美学,将计数映射到另一种美学(geom_bar通过计算行数为您完成此操作)。

library(tidyverse);  
ggplot(data = example %>%
         gather(year, type, -id)) +
  geom_bar(aes(x = year, fill = type), position = "dodge")

enter image description here

(请注意,我更改了示例以使不同年份的计数不同。否则,不清楚它是否有效。)

example <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "id  var2017  var2018  var2019
           1       A        B         A
           2       B        A         A
           3       B        A         B
           4       B        A         A     # var2017 A changed to B
           5       A        B         B")

答案 1 :(得分:0)

类似于上一个答案,但对管道使用了dplyr::countgeom_col和更清晰的语法:

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

example %>% 
  gather(Var, Val, -id) %>% 
  count(Var, Val) %>% 
  ggplot(aes(Var, n)) + 
    geom_col(aes(fill = Val), 
             position = "dodge")