如何合并 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)
如果我们没有一些计数为零的类别(例如,数据帧 b
和 c
没有等于 10 的值),那么我们可以这样做:
ggplot(df, aes(factor(value), fill=data_source)) +
geom_bar(position="dodge", colour="grey20", lwd=0.3)
但是请注意,当一个或两个数据框不包含给定值时,ggplot
如何扩展剩余的条:
假设我有:
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)
如果我们没有一些计数为零的类别(例如,数据帧 b
和 c
没有等于 10 的值),那么我们可以这样做:
ggplot(df, aes(factor(value), fill=data_source)) +
geom_bar(position="dodge", colour="grey20", lwd=0.3)
但是请注意,当一个或两个数据框不包含给定值时,ggplot
如何扩展剩余的条: