重新格式化数据框,以便能够使用ggplot2绘制条形图

时间:2018-06-06 12:17:09

标签: r dataframe ggplot2

问题是指重新格式化数据框(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:如何将数据显示在带有计数的同一条形图上?

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

输出图: enter image description here

示例数据:

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::gatherreshape2::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)

enter image description here

数据

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))