ggplot条形图,将多个组与参考组进行比较

时间:2019-07-17 16:31:12

标签: r ggplot2 dplyr

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)在单个面板中执行此操作。我该怎么办?

4 个答案:

答案 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

Plot Output

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

这是使用dplyrggplot2的替代解决方案,其中从其他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')

bar graph