我有一个非常大的数据框,其中第一列的每一行代表一个带有数字的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不必在输出中。
答案 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")
(请注意,我更改了示例以使不同年份的计数不同。否则,不清楚它是否有效。)
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::count
,geom_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")