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

使用TwoSlopeNorm绘制基因表达热图时触发ValueError的求助

TwoSlopeNorm绘制基因表达热图时触发ValueError的求助

你好呀!刚接触编程遇到这种报错确实会懵,别担心,这个问题其实很好解决😉

先帮你拆解下报错的根源:TwoSlopeNorm要求vmin和vmax必须是单个数值(标量),但你现在用data.min()和data.max()的时候,因为data是Pandas的DataFrame(表格型数据),直接调用min()/max()会返回每一列的最小/最大值,也就是一个带索引的Series(一维数组),不是单个值,所以Matplotlib没法处理,就抛出了这个ValueError。

修复方法超简单:

只需要把计算全局最小和最大值的代码改成嵌套调用min()和max(),这样就能拿到整个数据框里的全局最小/最大标量值了:

divnorm = TwoSlopeNorm(vmin=data.min().min(), vcenter=1.00, vmax=data.max().max())

另外还有个小细节:你代码里定义了rdgn这个自定义发散色板,但后面又指定了cmap='coolwarm',如果想用自己定义的那个色板,记得把cmap='coolwarm'改成cmap=rdgn哦~

修复后的完整代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt   
from matplotlib.colors import TwoSlopeNorm
import seaborn as sns

data = pd.read_csv(r"C:\Users\Hbeen\Desktop\aGPCR Pancreas.csv", header=1, index_col=0)

fig, ax = plt.subplots()
rdgn = sns.diverging_palette(h_neg=130, h_pos=10, s=99, l=55, sep=3, as_cmap=True)
# 修复vmin和vmax的计算逻辑,获取全局最小/最大值
divnorm = TwoSlopeNorm(vmin=data.min().min(), vcenter=1.00, vmax=data.max().max())
# 若想用自定义的rdgn色板,替换为cmap=rdgn即可
sns.heatmap(data, cmap='coolwarm', norm=divnorm, fmt ='.0%', 
        linewidths=0.5, linecolor='black', cbar=True, ax=ax)

plt.title("Expression von AGPCRs in Pankreas Zelllinien")
plt.xlabel("Gene")
plt.ylabel("Zelllinien")
plt.xticks(rotation=90, fontsize=6)
plt.yticks(fontsize=6)
plt.show()

新手小提示:

如果以后想确认某个变量的类型/内容,可以在代码里加一行print(变量名),比如print(data.min()),运行后就能看到它返回的是带列索引的Series,而不是单个数字,这样就能更快定位问题啦~

备注:内容来源于stack exchange,提问作者Deichgraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:00:28