在条形图中拆分组

Split groups in bar plot

我有一个数据框,其值对应于随时间评估的两个独立组。模拟数据如下:

Gene Name. Sample S1. Sample S2. Sample S3. Sample R1. Sample R2. Sample R3.
Gene 1         4          5          3          3          39        44
Gene 2         4         100        33          3          32        14

我使用 summarySE 函数融化了我的数据框并编译了摘要统计信息。然后我使用以下脚本绘制了我的数据:

plot = ggplot(tgastats2, aes(x=Gene Name, y=value, fill=Sample)) 
  + geom_bar(position=position_dodge(), stat="identity") +
  + geom_errorbar(aes(ymin=value-se, ymax=value+se),
                  + width=.2,
                  + position=position_dodge(.9))

我想做的是将 S1-3 的值组合在一起,将 R1-3 的值绘制在同一个图上,用一些 space 分开。任何帮助,将不胜感激。

这是可重现的数据:

df <- data.frame(
  Gene_name=c('Gene 1', 'Gene 2'),
  Sample.S1=c(4,4), Sample.S2=c(5,100), Sample.S3=c(3,33),
  Sample.R1=c(3,3), Sample.R2=c(39,32), Sample.R3=c(44,14)
)

现在,寻求解决方案。正如您所指出的,我们需要 "melt" 数据集。我的偏好是使用 dplyr 中的 gather(),但 melt() 的工作方式类似:

df1 <- df %>% gather(key='Sample', value='value', -Gene_name)

为了让 ggplot2 知道您希望按照您指定的方式对其进行分组,您需要对数据进行分类。 R 和 ggplot 不够聪明,无法理解 S1、S2 和 S3 属于一起,因此您必须告诉 R 如何做到这一点。可能有很多方法来分离和分类。没有看到您实际融化的 df,tgastats2,我不得不假设它与发布的示例相似。我将使用所有样本 R1-R3 都包含大写字母 "R" 而其他样本不包含的事实:

df1$my_group <- ifelse(grepl('R',df1$Sample),'R','S')

然后你可以绘图:

ggplot(df1, aes(x=Gene_name, y=value, fill=my_group)) +
  geom_col(position='dodge', color='black')

嗯...这看起来不对。这是怎么回事?好吧,ggplot 基于 df1$my_group 进行分离,但每个组中都有 3 个值。除了 fill= 美学之外,您还可以使用 group= 美学将它们分开,ggplot 会将它们完全分开:

ggplot(df1, aes(x=Gene_name, y=value, fill=my_group, group=Sample)) +
  geom_col(position='dodge', color='black')