问题是指重新格式化数据框(df)以应对使用ggplo2()在同一图表上显示三个条形图。感谢您的回复!
我在df中的数据:
colA, colB, colC
label1, label1, label2
label3, label1, label3
label4, label4, label2
label5, label4, label5
使用这些数据,我可以使用下面的命令为每列创建条形图,该命令显示给定列中每个标签的计数。
pl <- ggplot(df,aes(x=colA))
pl1 <- pl + geom_bar()
pl1 <- pl1 + theme(axis.text.x = element_text(angle = 90, hjust = 1))
pl1 <- pl1 + xlab('Labels')+ ylab('Count')
pl1 <- pl1 + ggtitle('Some Title') + theme(plot.title = element_text(hjust = 0.5))
print(pl1)
但是,我想描绘同一条形图上所有三列的计数,而不是单独的图表。我不想聚合三列的计数,但在同一图表中分别描述列,可能在每个标签的组中,但我不知道在这种情况下分组是否是正确的选择。我认为,数据格式需要创建所需的图表:
Labels, colA, colB, colC
label1, 1, 2, 0,
label2, 0, 0, 2,
label3, 1 0, 1,
label4, 1, 2, 0,
label5, 1, 0, 1,
问题1:如何将当前格式的数据重新格式化为所需格式?
问题2:如何将数据显示在带有计数的同一条形图上?
答案 0 :(得分:1)
其中一种方法是使用gather
以长格式转换数据,然后绘制
library(dplyr)
library(tidyr)
library(ggplot2)
df %>%
gather(column_name, column_value) %>%
group_by(column_value, column_name) %>%
tally() %>%
ggplot(aes(x = column_value, y = n, fill = column_name)) +
geom_bar(stat = "identity") +
xlab('Labels') +
ylab('Count')
其中传递给ggplot
的最终数据是
# column_value column_name n
#1 label1 colA 1
#2 label1 colB 2
#3 label2 colC 2
#4 label3 colA 1
#5 label3 colC 1
#6 label4 colA 1
#7 label4 colB 2
#8 label5 colA 1
#9 label5 colC 1
示例数据:
df <- structure(list(colA = c("label1", "label3", "label4", "label5"
), colB = c("label1", "label1", "label4", "label4"), colC = c("label2",
"label3", "label2", "label5")), .Names = c("colA", "colB", "colC"
), class = "data.frame", row.names = c(NA, -4L))
答案 1 :(得分:1)
对于您想要的格式,您可以轻松地执行tidyr::gather
和reshape2::dcast
组合。
library(tidyverse)
library(reshape2)
df %>%
gather(column, label) %>%
dcast(label ~ column, fun.aggregate = length, value.var = "column")
# label colA colB colC
# 1 label1 1 2 0
# 2 label2 0 0 2
# 3 label3 1 0 1
# 4 label4 1 2 0
# 5 label5 1 0 1
这是宽格式,在R语言中。使用ggplot2
时,使用long
格式实际上要容易得多。
df %>%
gather(column, label) %>%
group_by(column, label) %>%
count()
# column label n
# <chr> <chr> <int>
# 1 colA label1 1
# 2 colA label3 1
# 3 colA label4 1
# 4 colA label5 1
# 5 colB label1 2
# 6 colB label4 2
# 7 colC label2 2
# 8 colC label3 1
# 9 colC label5 1
您可以轻松地将结果传递给ggplot2
df %>%
gather(column, label) %>%
group_by(column, label) %>%
count() %>%
ggplot(aes(label, n)) +
geom_col() +
facet_wrap(~column)
数据
df <- structure(list(colA = c("label1", "label3", "label4", "label5"
), colB = c("label1", "label1", "label4", "label4"), colC = c("label2",
"label3", "label2", "label5")), class = "data.frame", row.names = c(NA,
-4L))