绘制火山图&热图

上一篇文章中,我们已经对基因进行了差异分析,接下来我们根据结果中的FDR值和FC值筛选出上调基因和下调基因(上调基因:基因转录成mRNA时受到正向调控,促进表达;下调基因:转录成mRNA时受到抑制,表达量减少),并绘制成火山图与热图。

所用工具:R语言;
所需要包:ggplot2、pheatmap。

第一部分:火山图

首先,加载所需的包并导入数据:

library(ggplot2)
diff_stat <- read.csv("F:/公众号/图文素材/绘制火山图&热图/data.csv", header = TRUE, row.names = 1)

在这里插入图片描述
其次,筛选上调趋势数据和下调趋势数据,对于Fold Change值和p值阈值的选择,还需在实际的分析中视情况而定,本文以|log2FC| ≥2以及FDR p-value < 0.05作为差异OTUs的判断依据:

diff_stat[which(diff_stat$FDR < 0.05 & diff_stat$logFC >= 2),'diff'] <- 'up' #上调趋势筛选
diff_stat[which(diff_stat$FDR < 0.05 & diff_stat$logFC <= -2),'diff'] <- 'dowm' #下调趋势筛选
diff_stat[!(diff_stat$diff %in% c('up', 'dowm')),'diff'] <- 'no'

最后,我们根据判断依据,将OTUs划分为“富集”(up)、“下降”(down)以及“无差异”(no)三种水平。然后,在作图时根据预先划分的OTUs差异水平对点分别着色。火山图实质上就是一种散点图,ggplot2作为一个非常好用的作图R包,我们直接用ggplot2进行绘制:

p1 <- ggplot(diff_stat, aes(x = logFC, y = -log10(FDR))) +
  geom_point(aes(color = diff), size = 0.5) +
  scale_colour_manual(limits = c('up', 'dowm', 'no'), values = c('blue', 'red', 'gray40'), labels = c('Enriched OTUs', 'Depleted OTUs', 'No diff OTUs')) +
  labs(x = 'log2 Fold Change', y = '-log10 FDR p-value')

在这里插入图片描述
我们可以对图进行美化,修改背景颜色、添加分界线、调整标签位置:

p1 <- p1 +
  theme(panel.grid.major = element_line(color = 'gray', size = 0.2), panel.background = element_rect(color = 'black', fill = 'transparent')) +
  geom_vline(xintercept = c(-2, 2), color = 'gray', linetype = 2, size = 0.5) + 
  geom_hline(yintercept = -log10(0.05), color = 'gray', linetype = 2, size = 0.5) +
  theme(legend.title = element_blank(), legend.key = element_rect(fill = 'transparent'), legend.background = element_rect(fill = 'transparent'), legend.position = c(0.2, 0.9))

在这里插入图片描述

知识笔记

差异分析是一个典型的多重假设检验过程,对于多重假设检验,单次检验中差异显著基因的假阳性率(p-value较小)可能会较大,而q-value和FDR值较常见的BH校正方法得到的FDR值而言,改进了其对假阳性估计的保守性。
即q-value相比于p-value更加严格,当差异基因结果较少时,可以退而求其次看p-value。Fold ChangeFold Change表示实验组比上对照组的差异表达倍数,一般表达相差2倍以上是有意义的,放宽要求1.5倍或者1.2倍也可以接受。

第二部分:热图

首先,加载所需的包并导入数据:

library(pheatmap)
sign.gene <- read.csv("F:/公众号/图文素材/绘制火山图&热图/data.csv", header = T , row.names = 1)

其次,筛选数据:

sign.gene.FDR <- sign.gene$FDR < 0.05
sign.gene.fc <- abs(sign.gene$logFC) > 2
sign.gene.all <- sign.gene.FDR & sign.gene.fc
sign.gene.real <- sign.gene[sign.gene.all, ]

如果样本中存在缺失值(例如:NA),我们可以用na.omit()进行删除:

sign.gene.real<-na.omit(sign.gene.real)

最后,绘制热图,并用基因标签代替基因ID作为热图的行标签:

pheatmap(log2(sign.gene.real[,3:85]+1), labels_row = sign.gene$Symbol)

在这里插入图片描述

也可以根据各自的需求进行美化:

pheatmap(log2(sign.gene.real[,3:85]+1),
         labels_row = sign.gene$Symbol,
         main="Heatmap",
         color = colorRampPalette(c("blue","white","red"))(256)
)

在这里插入图片描述
说明:
Color参数中的256是指色阶值,也可以理解为色阶分辨率,数值越大,热图上颜色越丰富,一般设置为256。

知识笔记

热图又称为聚类图,可以衡量样本或基因之间表达的相似性。
如本文所示的热图中,横坐标代表样本聚类,一列代表一个样本,聚类基于样本间基因表达的相似性,样本间基因表达越接近,靠的越近,以此类推。
纵坐标代表基因聚类,一行代表一个基因,聚类基于基因在样本中表达的相似性,基因在样本中表达越接近,靠的越近,以此类推。
色阶代表基因表达丰度,越红代表上调得越明显,越蓝代表下调得越明显。

总结

从热图上可以看出,所筛选出的差异基因并没有很好的区分出突变组和未突变组,所以在基因的筛选上,或者差异分析模型的选择上,需进行进一步的调整。

参考文章

https://blog.csdn.net/u012325865/article/details/87344725
http://blog.sciencenet.cn/blog-3406804-1188483.html
https://www.jianshu.com/p/f9040ca31f46

获取代码

以下是我的个人公众号,该篇的数据及代码可在公众号中回复“火山图&热图”即可获得,谢谢大家支持。
在这里插入图片描述

&lt;think&gt;好的,用户的问题是关于如何绘制或理解差异基因火山,特别是在生物信息学中使用Python或R语言进行数据可视化。我需要结合提供的引用资料,整理出清晰的步骤方法。 首先,火山的基本概念是什么?根据引用[2][4],火山主要用于展示差异分析结果,横轴通常是差异倍数(FoldChange)的对数值,纵轴是P值的负对数。这样可以将基因按照显著性变化程度分类。需要明确横纵轴的含义,以及如何确定阈值线。 接下来,绘制火山的步骤。引用[1][4]提到了Python中使用seaborn的scatterplot,而引用[2]提到了绘制,可能相关。需要整理数据准备、计算log2(FoldChange)-log10(p值),然后绘制散点,并添加阈值线。同时,引用[3]提到在线工具ImageGP,可以补充说明。 Python实现部分,代码示例需要展示数据处理,比如使用pandas读取数据,matplotlibseaborn绘。注意标注显著点,可能用不同颜色区分。引用[1]中的代码片段可以作为参考,但需要调整成火山的代码。 R语言部分,引用中并没有直接提到,但常见的方法是使用ggplot2。需要补充R的代码示例,比如如何用ggplot2做散点,添加阈值线,设置颜色。可能还需要提到Bioconductor中的EnhancedVolcano包,这虽然引用中没有,但属于常见做法,可以加入。 注意事项部分,引用[2]提到的聚类,但火山不需要,所以重点在阈值设置可视化优化。引用[3]提到参数调整,可以强调调整点的大小、透明度等。 最后,相关问题需要围绕火山的扩展,比如如何选择阈值、其他工具、解读结果、美化表以及火山的结合使用。确保问题覆盖用户可能感兴趣的后续步骤。 需要检查所有引用是否正确应用,比如引用[4]提到ax = sns.scatterplot,这在Python示例中要用到。同时确保LaTeX格式正确,如log$_2$(FoldChange)-log$_{10}$(p值)的表示,使用$包裹。 现在组织回答结构,分步骤讲解,确保每个部分都有引用支持,并在末尾添加相关问题。需要避免使用Markdown,保持自然的中文表达,同时遵循系统级指令的格式要求。&lt;/think&gt;### 如何绘制差异基因火山? 差异基因火山是生物信息学中用于展示差异表达基因的常用可视化工具,横轴为差异倍数(FoldChange)的对数值,纵轴为统计显著性(p值)的负对数[^1][^4]。以下是具体步骤及代码实现: --- #### **一、数据准备** 1. **输入数据** 需要包含三列:基因名称、差异倍数(FoldChange)、p值(或校正后的p值如FDR)。 2. **数据预处理** - 计算log$_2$(FoldChange) - 计算-log$_{10}$(p值) ```python import pandas as pd data = pd.read_csv(&quot;差异基因数据.csv&quot;) data[&quot;log2FC&quot;] = data[&quot;FoldChange&quot;].apply(lambda x: np.log2(x)) data[&quot;neg_log10_p&quot;] = -np.log10(data[&quot;pvalue&quot;]) ``` --- #### **二、绘制火山(Python)** 使用`matplotlib``seaborn`绘制散点,并标注显著性阈值线[^4]: ```python import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(10,6)) # 绘制所有基因 ax = sns.scatterplot( x=&quot;log2FC&quot;, y=&quot;neg_log10_p&quot;, data=data, hue=data.apply(lambda x: &quot;显著上调&quot; if x.log2FC &gt; 1 and x.neg_log10_p &gt; 1.3 else &quot;显著下调&quot; if x.log2FC &lt; -1 and x.neg_log10_p &gt; 1.3 else &quot;不显著&quot;, axis=1), palette={&quot;不显著&quot;:&quot;gray&quot;, &quot;显著上调&quot;:&quot;red&quot;, &quot;显著下调&quot;:&quot;blue&quot;}, alpha=0.6 ) # 添加阈值线 plt.axvline(x=1, color=&quot;black&quot;, linestyle=&quot;--&quot;) plt.axvline(x=-1, color=&quot;black&quot;, linestyle=&quot;--&quot;) plt.axhline(y=1.3, color=&quot;black&quot;, linestyle=&quot;--&quot;) # 假设p&lt;0.05 plt.xlabel(&quot;log$_2$(FoldChange)&quot;) plt.ylabel(&quot;-log$_{10}$(p值)&quot;) plt.title(&quot;差异基因火山&quot;) plt.show() ``` --- #### **三、绘制火山(R语言)** 在R中使用`ggplot2`: ```r library(ggplot2) data &lt;- read.csv(&quot;差异基因数据.csv&quot;) data$log2FC &lt;- log2(data$FoldChange) data$neg_log10_p &lt;- -log10(data$pvalue) ggplot(data, aes(x=log2FC, y=neg_log10_p, color=ifelse(abs(log2FC) &gt; 1 &amp; neg_log10_p &gt; 1.3, ifelse(log2FC &gt; 1, &quot;up&quot;, &quot;down&quot;), &quot;ns&quot;))) + geom_point(alpha=0.6) + scale_color_manual(values=c(&quot;up&quot;=&quot;red&quot;, &quot;down&quot;=&quot;blue&quot;, &quot;ns&quot;=&quot;gray&quot;)) + geom_vline(xintercept=c(-1,1), linetype=&quot;dashed&quot;) + geom_hline(yintercept=1.3, linetype=&quot;dashed&quot;) + labs(x=&quot;log2(FoldChange)&quot;, y=&quot;-log10(p值)&quot;, color=&quot;&quot;) + theme_classic() ``` --- #### **四、注意事项** 1. **阈值选择** - FoldChange阈值通常设为2倍(即|log$_2$FC| &gt;1) - p值阈值常用0.05或校正后的FDR(对应-log$_{10}$(0.05)=1.3) 2. **优化可视化** - 调整点的大小(`s`参数)、透明度(`alpha`) - 使用`EnhancedVolcano`(R包)或`plotly`(Python)增强交互性[^3] --- #### **五、在线工具推荐** - **ImageGP**:支持火山在线生成,只需上传数据矩阵,设置参数即可输出发表级片[^3]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值