dat <-
data.frame(keyId = rep(c('A','B','C','D'), times = 4),
group = rep(1:4, each = 4),
value = sample(1:100, 16))
ggplot(dat, aes(x = as.factor(keyId), y = as.factor(value))) +
geom_bar(position = 'dodge', stat = 'identity') +
facet_wrap(~group)
我想要的是:
temp1 <- dat %>% dplyr::filter(group %in% c(1, 4))
temp2 <- dat %>% dplyr::filter(group %in% c(2, 4))
temp3 <- dat %>% dplyr::filter(group %in% c(3, 4))
ggplot(temp1, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
ggplot(temp2, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
ggplot(temp3, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
即我想绘制比较第4组与第1组,第2组,第3组的条形图。我试图使用facet_wrap(〜group)在单个面板中执行此操作。我该怎么办?
答案 0 :(得分:1)
也许我错过了使事情变得更复杂的事情,但是您可以放弃带有列表的临时数据帧,而只为所有这些子集制作一个长数据帧。如果您指定列表名称,则可以将其与.id
的{{1}}参数一起使用,它将成为构面变量。
dplyr::bind_rows
此外,library(dplyr)
library(ggplot2)
dat <- data.frame(keyId = rep(c('A','B','C','D'), times = 4),
group = rep(1:4, each = 4),
value = sample(1:100, 16))
dat_paired <- list(
set1 = filter(dat, group %in% c(1, 4)),
set2 = filter(dat, group %in% c(2, 4)),
set3 = filter(dat, group %in% c(3, 4))
) %>%
bind_rows(.id = "set")
head(dat_paired)
#> set keyId group value
#> 1 set1 A 1 21
#> 2 set1 B 1 57
#> 3 set1 C 1 66
#> 4 set1 D 1 33
#> 5 set1 A 4 1
#> 6 set1 B 4 32
ggplot(dat_paired, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_col(position = "dodge") +
facet_wrap(vars(set))
与geom_bar(stat = "identity")
相同。
答案 1 :(得分:1)
考虑添加一个新的 indicator ,然后按组扩展数据框,其中每个子集将一个第四组与一个 new_group 指示器连接起来。
以下使用基础R方法:ifelse
(用于 indicator 列的条件赋值),by
(用于分组),rbind
+ {{1} }(用于连接数据帧),do.call
(用于添加 new_group 列),transform
(用于删除多余的行)。
subset
答案 2 :(得分:0)
有可能,但是使用plot_grid
:
使用cowplot::plot_grid()
而非facet
d1 <- ggplot(temp1, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
d2 <- ggplot(temp2, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
d3 <- ggplot(temp3, aes(x = as.factor(keyId), y = value, fill = as.factor(group))) +
geom_bar(position = 'dodge', stat = 'identity')
library(cowplot)
plot_grid(d1, d2, d3)
如果您要坚持使用facet
,则需要更改数据框以仅创建3组:
newDat <- rbind(dat %>%
filter(group == 4) %>%
slice(rep(row_number(), 3)) %>%
mutate(new_group = rep(1:3, each = 4)),
dat %>%
filter(group != 4) %>%
mutate(new_group = group)) %>%
mutate(fill_group) = ifelse(group == 4, 3, 1))
ggplot(data = newDat, aes(x = as.factor(keyId), y = value, fill = as.factor(fill_group))) +
geom_bar(position = 'dodge', stat = 'identity') +
facet_wrap(~new_group)
这将为您提供所需的内容
答案 3 :(得分:0)
这是使用dplyr
和ggplot2
的替代解决方案,其中从其他3组中减去第4组的值,然后绘制差异。
dat %>% filter(group==4) %>% select(-group,value.4=value) %>%
left_join(dat,.) %>% mutate(diff=value-value.4) %>%
filter(group!=4) %>%
ggplot(aes(keyId,diff,fill=keyId)) + geom_bar(stat='identity') +
facet_wrap(~group) + theme(legend.position = 'none') +
ylab('Difference of Group 4')