查看原文
其他

R语言绘制蝴蝶(柱状)图示例

生信小白鱼 鲤小白 小白鱼的生统笔记 2022-05-08
ggplot2绘制蝴蝶图

今天再介绍一种柱状图,蝴蝶图。因形似蝴蝶,故俗称蝴蝶图。事实上昨天介绍过的“双向柱状图”就是蝴蝶图的一种类型,毕竟两侧对称嘛。在蝴蝶图中,两侧数据即可共享同一坐标轴,也可各自独立。先前的ggplot2绘制双向柱状图中,我们的数据共用同一坐标轴;因此本文再展示ggplot2绘制分开坐标轴的情形。

鉴于白鱼小编的一贯作风,实在懒得自己想,就仿别人的来。例如这篇文献中使用了“蝴蝶图”的柱状图样式,展示了top10 GO和KEGG富集通路(“LncRNA Expression Profile of Human Thoracic Aortic Dissection by High- Throughput Sequencing”)。正好图中两侧坐标轴各自独立的,那么今天咱们就准备整个类似的出来。

    
本文使用的作图数据的网盘链接(提取码 rc11):
https://pan.baidu.com/s/1tb-5JwXnsLvwcHlHA3Q5lg
对某RNA-seq数据中的差异基因作GO富集分析,得到GO.MF.up.txt”和“GO.MF.down.txt”,分别记录了GO MF中的显著上调、下调term。


ggplot2绘制蝴蝶图

  

我们首先读取示例数据,按p值对GO term排个序。此外,有时候两边的数据条目数量不一定完全一致,为了使图片(柱子)的比例不至于失调,我们可选在其中填补空白数据作为代替(关于填不填补空白数据的效果对比,参考下文最终出图)。
#读取数据
up <- read.delim('GO.MF.up.txt', sep = '\t', stringsAsFactors = FALSE)
down <- read.delim('GO.MF.down.txt', sep = '\t', stringsAsFactors = FALSE)

#按 p 值排序,同时当两数据不等长时补充空白数据(尽可能使蝴蝶图对称)
up <- up[order(up$P_Value, decreasing = TRUE), ]
up$Term <- factor(up$Term, levels = up$Term)
id_up <- levels(up$Term)
down <- down[order(down$P_Value, decreasing = TRUE), ]
down$Term <- factor(down$Term, levels = down$Term)
id_down <- levels(down$Term)

n <- length(up$Term) - length(down$Term)
if (n > 0) {
down$Term <- as.character(down$Term)
for (i in paste('nn', as.character(seq(1, n, 1)), sep = '')) down <- rbind(list(i, NA, NA), down)
down$Term <- factor(down$Term, levels = down$Term)
id_down <- c(rep('', n), id_down)
} else if (n < 0) {
up$Term <- as.character(up$Term)
for (i in paste('nn', as.character(seq(1, abs(n), 1)), sep = '')) up <- rbind(list(i, NA, NA), up)
up$Term <- factor(up$Term, levels = up$Term)
id_up <- c(rep('', abs(n)), id_up)
}

    

然后加载ggplot2,作图。由于左右两侧的坐标轴是独立的,因此需要分别绘制两侧的柱状图。
##ggplot2 作图
library(ggplot2)

#上调 GO
p_up <- ggplot(up, aes(Term, log(P_Value, 10))) +
geom_col(fill = 'red2', color = 'black', width = 0.6) +
theme(panel.grid = element_blank(), panel.background = element_rect(fill = 'transparent')) +
theme(axis.line.x = element_line(colour = 'black'), axis.line.y = element_line(colour = 'transparent'), axis.ticks.y = element_line(colour = 'transparent')) +
theme(plot.title = element_text(hjust = 0.5, face = 'plain')) +
coord_flip() +
geom_hline(yintercept = 0) +
labs(x = '', y = '', title = 'UP') +
scale_y_continuous(expand = c(0, 0), breaks = c(-12, -8, -4, 0), labels = as.character(abs(c(-12, -8, -4, 0)))) + #这儿更改间距设置
scale_x_discrete(labels = id_up)


#下调 GO
p_down <- ggplot(down, aes(Term, -log(P_Value, 10))) +
geom_col(fill = 'green4', color = 'black', width = 0.6) +
theme(panel.grid = element_blank(), panel.background = element_rect(fill = 'transparent')) +
theme(axis.line.x = element_line(colour = 'black'), axis.line.y = element_line(colour = 'transparent'), axis.ticks.y = element_line(colour = 'transparent')) +
theme(plot.title = element_text(hjust = 0.5, face = 'plain')) +
geom_hline(yintercept = 0) +
coord_flip() +
labs(x = '', y = '', title = 'DOWN') +
scale_y_continuous(expand = c(0, 0), breaks = c(0, 2, 4, 6), labels = as.character(c(0, 2, 4, 6))) + #这儿更改间距设置
scale_x_discrete(labels = id_down, position = 'top')
上调GO term:

下调GO term(本示例中,下调term数量比上调term数量少一个,我们使用空白数据填补,可保证两个柱状图的柱子尺寸保持一致):


最后再将左右两侧的柱状图组合到一起,就搞定啦。
#合并输出pdf
library(cowplot)

pdf('butterfly.pdf', width = 14, height = 5)
plot_grid(p_up, p_down, nrow = 2, ncol = 2, rel_heights = c(9, 1), labels = 'GO_Enrichment Score (-log10(p-value))', label_x = 0.5, label_y = 0, label_fontface = 'plain')
dev.off()

如果之前我们不在下调term数据中插补空白term的话,出图将会是下图这样的(我是觉得两边柱子尺寸、分布不一致,怪怪的,像这种差1个还不明显,但是差的多的话就很难看;当然每个人审美不一样,你要觉得可以的话,就无需插补空白数据,直接导入数据作图就可以了):

    

本篇介绍的即为来自两侧独立柱状图(独立坐标轴)组合的蝴蝶图类型。

正如开篇提到的,对于两侧共享坐标轴的蝴蝶图,参考前文“双向柱状图”即可。



友情链接

  

R语言绘制双向柱状图

R语言绘制分组柱状图

R语言绘制堆叠面积图

R语言绘制堆叠柱状图

R语言绘制星形图

R语言绘制圆环图

R语言绘制饼图(扇形图)

R语言绘制花瓣图

R语言绘制韦恩图

韦恩图在线绘制网站




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存