带有 ggplot2 的条形图用于基因表达

Posted

技术标签:

【中文标题】带有 ggplot2 的条形图用于基因表达【英文标题】:barplot with ggplot2 for gene expression 【发布时间】:2015-11-12 01:07:37 【问题描述】:

我是 ggplot2 的新手,我很难通过 2 个因素为每个基因制作条形图。

我想通过 2 个因素分别绘制每个基因:“cell_type”和“age”。

x 轴代表“细胞类型”(6) 类别,每个“细胞类型”类别内应有 5 个代表“年龄”类别的条形图。 y 轴代表基因表达值(平均值 + 误差线)。

我的代码:

mat= t(exprs(eSet))
colnames(mat) = fData(eSet)$Symbol
rownames(mat = pData(eSet)$genotype
GENOTYPE <- rownames(mat)
AGE <- pData(eSet)$age
d.f_all_genes2 <- data.frame(GENOTYPE, AGE, mat)

d.f_all_genes2[1:3,1:10]

GENOTYPE AGE X1.2.SBSRNA4 A1BG A1BG.AS1 A1CF A2LD1 A2M A2ML1 A2MP1
1 rag_a   54            0    0        0    0     0   0     0     0
2 rag_wt  54            0    0        0    0     0  18     0     0
3 wt_wt   54            0    0        0    0     0   1     0     0

melted <- melt(d.f_all_genes2, id.vars="GENOTYPE") 
head(melted)

           GENOTYPE   variable value
1           rag_a       AGE     54
2           rag_wt      AGE     54
3           wt_wt       AGE     54

不幸的是,我失去了所有的基因。

我还打算做以下事情:

means <- ddply(melted, c("AGE", "variable"), summarise, mean=mean(value))
means.sem <- ddply(melted, c("AGE", "variable"), summarise, mean=mean (value),sem=sd(value)/sqrt(length(value)))
means.sem <- transform(means.sem, lower=mean-sem, upper=mean+sem)

ggplot(means[means$variable == "GENE of Interest=Symbol",], aes(x = factor(AGE), y = mean))  + geom_bar(stat= "identity", colour = "blue", outlier.shape = NA)+ facet_grid(~GENOTYPE) + facet_wrap(~variable) +  ylab(expression(paste(Log[2], " Expression Values"))) + theme(axis.text=element_text(size=13, color="black"),axis.title=element_text(size=12, face="bold",color="black"), plot.title=element_text(size=14,face="bold", color="black"), strip.text.x = element_text(colour = "black", face= "bold",angle = 0, size = 20)) 

非常感谢任何关于如何使其发挥作用的建议和帮助。

非常感谢。

【问题讨论】:

根据描述,您的id.vars 似乎应该包括AGEGENOTYPE 欢迎来到 SO!请填写完整的reproducible example,这将增加您获得完整答案的几率。 【参考方案1】:

从您的示例中很难看出,但在下面我将假设您的原始表对于每个年龄/基因型组合都有不止一行。

cmets 中的第一位 aosmith 关于melt 的说法是正确的。您还可以为变量命名以使事情更清楚。声明应该是:

>melted <- melt(d.f_all_genes2, id.vars=c("GENOTYPE", "AGE"), variable_name="Symbol")
   GENOTYPE AGE       Symbol value
1     rag_a  54 X1.2.SBSRNA4     0
2    rag_wt  54 X1.2.SBSRNA4     0
3     wt_wt  54 X1.2.SBSRNA4     0
4     rag_a  54         A1BG     0
5    rag_wt  54         A1BG     0
6     wt_wt  54         A1BG     0
....<SNIP>...

现在您有了正确格式的数据,是时候绘制它了。总是很难描述你想要什么,但我想你想要一个面板网格,基因型从左到右排列,基因从上到下排列。您可能需要考虑点而不是条形,然后将所有基因型放在一个图上,但这是您如何制作条形的。

首先要绘制的数据是融化后的数据

> gg <- ggplot(melted)

在 x 轴上你想要 AGE 和在 y 轴上 value,所以:

> gg <- gg + aes(x=AGE, y=value)

你想要一个面板或构面的网格,所以:

> gg <- gg + facet_grid(Symbol~GENOTYPE)

现在真是一个巧妙的把戏。 ggplot 可以使用stat_summary 为你做总结,所以不需要事先做。

> gg <- gg + stat_summary(fun.y=mean, geom="bar", fill="blue")

添加条形。您还需要添加错误栏,我将定义一个 sem 函数以使其更整洁:

> sem <- function(x) sqrt(var(x)/length(x))
> gg <- gg + stat_summary(fun.ymin=function(x) mean(x)-sem(x),
+                         fun.ymax=function(x) mean(x)+sem(x), 
+                         fun.y=mean,
+                         geom="errorbar")

剩下的就是添加格式

> gg <- gg + ylab(expression(paste(Log[2], " Expression Values"))) + theme(axis.text=element_text(size=13, color="black"),axis.title=element_text(size=12, face="bold",color="black"), plot.title=element_text(size=14,face="bold", color="black"), strip.text.x = element_text(colour = "black", face= "bold",angle = 0, size = 20)) 

【讨论】:

非常感谢伊恩。它按我想要的方式工作。 ggplot(melted[melted$Symbol=="APP",],aes(x=AGE, y=value) + stat_summary(fun.y=mean, geom="bar", fill="blue") + facet_grid(~ GENOTYPE)我可以为任何感兴趣的基因绘制图。不幸的是,错误栏功能不起作用。我应该用 x 代替基因符号的值吗?非常感谢。 对不起,我的错。我已将参数编辑为 stat_summary。现在应该可以工作了。

以上是关于带有 ggplot2 的条形图用于基因表达的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 - 带有堆栈和闪避的条形图

ggplot2 和带有负值的堆积条形图

带有ggplot2的发散堆积条形图:图例中的因子排序问题

带有 facet_grid 的 ggplot2 中具有多个分类变量的堆积条形图

带有facet_grid的ggplot2中带有多个分类变量的堆积条形图

用均值条形图及其标准差 ggplot2 总结数据框