在条形图中拆分组
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')
我有一个数据框,其值对应于随时间评估的两个独立组。模拟数据如下:
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')