You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas火山图上正确标记异常值?解决坐标匹配与报错问题

火山图标注异常值:解决TypeError并设置正确Y坐标

问题背景

我需要在自己绘制的火山图上标记几个异常值,计划先筛选出log2FoldChange数值最大的3个基因组成DataFrame子集,再用该子集完成标注。但火山图Y轴采用的是-pvalue的-log10转换值,使用原始pvalue作为标签Y坐标时,标签会聚集在图底部;尝试直接调用转换后的值设置坐标时,出现「TypeError: unhashable type: 'Series'」报错。希望通过Python代码实现标注,而非后期处理。

错误原因

你报错的核心问题是直接将转换后的Series作为DataFrame的列索引——DataFrame的列索引必须是可哈希的类型(比如字符串),而Series属于不可哈希对象,因此触发TypeError。

解决方案

不要在索引操作里直接计算转换值,先给筛选出的子集新增一列存储转换后的Y坐标值,再用这列数据进行标注。同时修正示例代码里的df2笔误(应为df)。

完整修正代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 示例数据
data = {'log2FoldChange': [15, 16, 2, 3],
        'pvalue': [0.0000005, 0.00006, 0.7, 0.9],
        'padj': [0.0008, 0.005, 0.0008, 0.0007],
        'gene_name': ['gene1', 'gene2', 'gene3', 'gene4']}
df = pd.DataFrame(data)

# 筛选log2FoldChange最大的3个基因
outliersx = df.nlargest(3, 'log2FoldChange')
# 新增列:预计算火山图Y轴对应的-log10(pvalue)
outliersx['neg_log10_pvalue'] = outliersx['pvalue'].apply(lambda x: -np.log10(x))

# 显式创建绘图对象,避免plt/ax混用的上下文问题
fig, ax = plt.subplots()

# 绘制所有基因点
ax.scatter(x=df['log2FoldChange'], y=df['pvalue'].apply(lambda x: -np.log10(x)), s=1)

# 绘制参考虚线
ax.axvline(0.6, color="grey", linestyle="--")
ax.axvline(-0.6, color="grey", linestyle="--")
ax.axhline(1.3, color="grey", linestyle="--")

# 标记显著下调基因
down = df[(df['log2FoldChange'] <= -0.6) & (df['pvalue'] <= 0.05)]
ax.scatter(x=down['log2FoldChange'], y=down['pvalue'].apply(lambda x: -np.log10(x)), 
           s=3, label="Down-regulated", color="blue")

# 标记显著上调基因
up = df[(df['log2FoldChange'] >= 0.6) & (df['pvalue'] <= 0.05)]
ax.scatter(x=up['log2FoldChange'], y=up['pvalue'].apply(lambda x: -np.log10(x)), 
           s=3, label="Up-regulated", color="red")

# 设置坐标轴标签
ax.set_xlabel("log2foldchange")
ax.set_ylabel("-log10(pvalue)")

# 标注异常值基因(x坐标、y坐标、基因名对应子集列)
outliersx.apply(lambda row: ax.text(row['log2FoldChange'], row['neg_log10_pvalue'], row['gene_name']), axis=1)

plt.legend()
plt.show()

关键优化点

  • 提前计算转换后的Y值并存储为新列,既解决索引报错问题,也让代码逻辑更清晰
  • 显式创建fig, ax绘图对象,避免plt和ax混用导致的上下文混乱
  • 确保ax.text()的参数顺序与子集列严格对应(x坐标→y坐标→文本内容)

内容的提问来源于stack exchange,提问作者Adriana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:22:33