使用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
相关产品推荐
相关产品推荐

