如何合并 geom_bar 三个数据帧?

How to combine geom_bar for three dataframe?

假设我有:

a = data.frame(a = sample(1:10, 20, replace = T))
b = data.frame(b = sample(1:11, 19, replace = T))
c = data.frame(c = sample(1:9, 21, replace = T))

a.a = ggplot(data = a, aes(a)) + geom_bar()
b.b = ggplot(data = b, aes(b)) + geom_bar()
c.c = ggplot(data = c, aes(c)) + geom_bar()

如何将 a.a、b.b 和 c.c 合并到一个图中?喜欢

我试过了

d = ggplot() + 
  geom_bar(data = a.a, aes(a)) +
  geom_bar(data = b.b, aes(b)) +
  geom_bar(data = c.c, aes(c))
d

但是没用...

将它们组合成一个 "long" 数据框,该数据框有一个分组列标记每一行来自哪个数据框。

library(reshape2)
library(dplyr)

# Individual data frames
a = data.frame(a = sample(1:10, 20, replace = T))
b = data.frame(b = sample(1:11, 19, replace = T))
c = data.frame(c = sample(1:9, 21, replace = T))

合并 "long" 格式的数据帧。数据框有不同的行数,所以我们需要新的分组变量(下面称为 data_source)来重复每个数据框的名称,次数等于每个数据框的行数。我们使用 rep 函数来处理这个问题。一种方法如下:rep(c("a","b","c"), times=c(nrow(a), nrow(b), nrow(c))),但是,我在下面使用 sapply,因为它看起来更干净(尽管可能更不透明)。

df = data.frame(value =c(a$a,b$b,c$c), 
                data_source=rep(c("a","b","c"), times=sapply(list(a,b,c), nrow)))

# Pre-summarise counts in order to add zero counts for empty categories
df.summary = df %>% group_by(data_source, value) %>%
  tally %>%
  dcast(data_source ~ value, value.var="n", fill=0) %>%
  melt(id.var="data_source", variable.name="value", value.name="n")

ggplot(df.summary, aes(value, n, fill=data_source)) + 
  geom_bar(stat="identity", position="dodge", colour="grey20", lwd=0.3) 

如果我们没有一些计数为零的类别(例如,数据帧 bc 没有等于 10 的值),那么我们可以这样做:

ggplot(df, aes(factor(value), fill=data_source)) + 
  geom_bar(position="dodge", colour="grey20", lwd=0.3) 

但是请注意,当一个或两个数据框不包含给定值时,ggplot 如何扩展剩余的条: