python中如何画火山图

来源:Golang编程网作者:上海GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《python中如何画火山图》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《python中如何画火山图》有用,将其分享出去将是对创作者最好的鼓励。

火山图的核心逻辑是将差异分析的结果进行可视化呈现,横轴通常为log2转换后的差异倍数,纵轴为-log10转换后的P值,图中每个点代表一个检测变量,通常会根据差异显著性对点进行颜色区分,方便快速定位关键变量。

绘制火山图的准备工作

首先需要安装必要的python库,常用的绘图库为matplotlib和seaborn,数据处理使用pandas,同时需要numpy进行数值计算。如果还未安装这些库,可以通过以下命令安装:

pip install pandas numpy matplotlib seaborn

接下来需要准备差异分析的结果数据,数据至少需要包含三列:变量名称、log2差异倍数(log2FoldChange)、显著性P值(pvalue)。这里我们先构造一份模拟数据用于演示:

import pandas as pd
import numpy as np

# 构造模拟差异分析结果数据
np.random.seed(42)
data = pd.DataFrame({
    "gene_id": [f"gene_{i}" for i in range(1000)],
    "log2FoldChange": np.random.uniform(-3, 3, 1000),
    "pvalue": np.random.uniform(0, 1, 1000)
})
# 随机设置部分P值为极小值,模拟显著差异的结果
data.loc[data.sample(frac=0.1).index, "pvalue"] = np.random.uniform(0, 0.001, 100)
print(data.head())

基础火山图绘制步骤

我们使用matplotlib完成基础火山图的绘制,核心步骤包括设置画布、绘制散点、添加辅助线、设置坐标轴标签和标题等。

步骤1:计算纵轴数值并添加差异标记

纵轴需要的是P值的负对数,同时我们需要定义差异显著的阈值,通常设置log2FoldChange的绝对值大于1且P值小于0.05为显著差异变量,为后续颜色区分做准备:

import matplotlib.pyplot as plt

# 计算-log10(pvalue)
data["neg_log10_pvalue"] = -np.log10(data["pvalue"])

# 定义差异显著的条件:|log2FoldChange|>1 且 pvalue<0.05
data["significant"] = (data["log2FoldChange"].abs() > 1) & (data["pvalue"] < 0.05)
# 定义颜色映射:显著差异为红色,不显著为灰色
data["color"] = data["significant"].apply(lambda x: "red" if x else "gray")

步骤2:绘制散点图并添加辅助元素

接下来绘制散点图,同时添加差异倍数的阈值线和P值的阈值线,方便区分不同区域的点:

# 设置中文字体,避免中文显示乱码
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 创建画布
plt.figure(figsize=(10, 6))
# 绘制散点
plt.scatter(
    data["log2FoldChange"],
    data["neg_log10_pvalue"],
    c=data["color"],
    alpha=0.6,
    s=20
)
# 添加阈值线
plt.axvline(x=1, color="black", linestyle="--", linewidth=1)
plt.axvline(x=-1, color="black", linestyle="--", linewidth=1)
plt.axhline(y=-np.log10(0.05), color="black", linestyle="--", linewidth=1)
# 设置坐标轴标签和标题
plt.xlabel("log2(差异倍数)")
plt.ylabel("-log10(P值)")
plt.title("差异分析结果火山图")
# 添加图例
import matplotlib.patches as mpatches
red_patch = mpatches.Patch(color="red", label="显著差异变量")
gray_patch = mpatches.Patch(color="gray", label="无显著差异变量")
plt.legend(handles=[red_patch, gray_patch])
# 显示图形
plt.show()

使用seaborn优化火山图样式

seaborn库可以基于matplotlib提供更美观的默认样式,我们可以通过seaborn快速调整火山图的视觉效果,同时可以添加更多统计信息标注。

import seaborn as sns

# 设置seaborn样式
sns.set_style("whitegrid")
# 创建画布
plt.figure(figsize=(10, 6))
# 使用seaborn绘制散点,通过hue参数区分显著差异和不显著差异
sns.scatterplot(
    data=data,
    x="log2FoldChange",
    y="neg_log10_pvalue",
    hue="significant",
    palette={True: "red", False: "gray"},
    alpha=0.6,
    s=20,
    legend=False
)
# 添加阈值线
plt.axvline(x=1, color="black", linestyle="--", linewidth=1)
plt.axvline(x=-1, color="black", linestyle="--", linewidth=1)
plt.axhline(y=-np.log10(0.05), color="black", linestyle="--", linewidth=1)
# 设置标签和标题
plt.xlabel("log2(差异倍数)")
plt.ylabel("-log10(P值)")
plt.title("seaborn优化的差异分析火山图")
# 添加自定义图例
red_patch = mpatches.Patch(color="red", label="显著差异变量")
gray_patch = mpatches.Patch(color="gray", label="无显著差异变量")
plt.legend(handles=[red_patch, gray_patch])
# 显示图形
plt.show()

火山图常见问题与调整方法

  • 如果图形中点的重叠度过高,可以适当调小点的大小s参数,或者调低alpha透明度参数
  • 如果需要标注差异最显著的几个变量,可以筛选出对应行,在图形上添加文本标注,使用plt.text()函数实现
  • 如果需要调整颜色方案,可以修改color参数或者seaborn的palette参数,选择符合需求的配色
  • 如果P值存在0的情况,计算负对数时会出现无穷大,需要提前对P值做微小偏移,比如将P值替换为np.maximum(pvalue, 1e-10)

完整可运行代码示例

以下是整合了所有步骤的完整代码,读者可以直接运行得到最终的火山图:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.patches as mpatches

# 1. 构造模拟数据
np.random.seed(42)
data = pd.DataFrame({
    "gene_id": [f"gene_{i}" for i in range(1000)],
    "log2FoldChange": np.random.uniform(-3, 3, 1000),
    "pvalue": np.random.uniform(0, 1, 1000)
})
data.loc[data.sample(frac=0.1).index, "pvalue"] = np.random.uniform(0, 0.001, 100)

# 2. 数据预处理
data["neg_log10_pvalue"] = -np.log10(np.maximum(data["pvalue"], 1e-10))
data["significant"] = (data["log2FoldChange"].abs() > 1) & (data["pvalue"] < 0.05)

# 3. 设置绘图样式
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
sns.set_style("whitegrid")

# 4. 绘制火山图
plt.figure(figsize=(10, 6))
sns.scatterplot(
    data=data,
    x="log2FoldChange",
    y="neg_log10_pvalue",
    hue="significant",
    palette={True: "red", False: "gray"},
    alpha=0.6,
    s=20,
    legend=False
)
# 添加阈值线
plt.axvline(x=1, color="black", linestyle="--", linewidth=1)
plt.axvline(x=-1, color="black", linestyle="--", linewidth=1)
plt.axhline(y=-np.log10(0.05), color="black", linestyle="--", linewidth=1)
# 设置标签和标题
plt.xlabel("log2(差异倍数)")
plt.ylabel("-log10(P值)")
plt.title("python绘制的完整差异分析火山图")
# 添加图例
red_patch = mpatches.Patch(color="red", label="显著差异变量")
gray_patch = mpatches.Patch(color="gray", label="无显著差异变量")
plt.legend(handles=[red_patch, gray_patch])
# 显示图形
plt.show()

python火山图matplotlibseaborn数据可视化修改时间:2026-06-10 15:18:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。