0

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

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 的值绘制在同一个图上,并用一些空格隔开。任何帮助,将不胜感激。

4

1 回答 1

0

以下是可重现的数据:

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

现在,寻求解决方案。正如您所指出的,我们需要“融化”数据集。我的偏好是使用gather()from dplyr,但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 个值。group=除了美学之外,您还可以使用fill=美学ggplot将它们分开,并将它们完全分开:

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

在此处输入图像描述

于 2020-06-09T12:32:31.693 回答