我想绘制一个以值 1 为中心的热图,显示与细胞系相对应的基因表达,使用此代码:
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)
divnorm = TwoSlopeNorm (vmin=data.min(), vcenter=1.00, vmax=data.max())
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()
每次运行它时,它都会抛出一个
ValueError
,我不知道如何修复,因为我对编码完全陌生。由于我不知道为什么会出现此错误,所以我什至不知道如何开始修复它。我尝试在这个网站上寻找答案,但问题中没有包含熊猫,所以它们对我没有多大帮助。
runfile('C:/Users/Hbeen/Desktop/unbenannt0.py', wdir='C:/Users/Hbeen/Desktop')
Traceback (most recent call last):
File ~\anaconda3\Lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec
exec(code, globals, locals)
File c:\users\hbeen\desktop\unbenannt0.py:17
divnorm = TwoSlopeNorm (vmin=data.min(), vcenter=1.00, vmax=data.max())
File ~\anaconda3\Lib\site-packages\matplotlib\colors.py:1493 in __init__
super().__init__(vmin=vmin, vmax=vmax)
File ~\anaconda3\Lib\site-packages\matplotlib\colors.py:1279 in __init__
self._vmin = _sanitize_extrema(vmin)
File ~\anaconda3\Lib\site-packages\matplotlib\colors.py:208 in _sanitize_extrema
ret = ex.item()
File ~\anaconda3\Lib\site-packages\pandas\core\base.py:418 in item
raise ValueError("can only convert an array of size 1 to a Python scalar")
ValueError: can only convert an array of size 1 to a Python scalar
这是我得到的错误,显然是在尝试运行时发生的
TwoSlopeNorm (vmin=data.min(), vcenter=1.00, vmx=data.max()
该错误表明当您调用 data.min() 和 data.max() 时,它返回 pandas.Series 对象,而不是标量值。因为传递给 TwoSlopeNorm 的这些系列期望 vmin 和 vmax 被赋予单个值,但实际上是其内容为多个值的数组(系列)。
要解决这个问题,您可以使用 .min().min() 和 .max().max() 并确保您获取的是整个 DataFrame 的最小值或最大值。这意味着这些提取表中所有单元格的最小值和最大值的标量值,而不是这些值的序列。