Value Error 只能将大小为 1 的数组转换为 Python 标量

问题描述 投票:0回答:1

我想绘制一个以值 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()
python pandas numpy matplotlib
1个回答
0
投票

该错误表明当您调用 data.min() 和 data.max() 时,它返回 pandas.Series 对象,而不是标量值。因为传递给 TwoSlopeNorm 的这些系列期望 vmin 和 vmax 被赋予单个值,但实际上是其内容为多个值的数组(系列)。

要解决这个问题,您可以使用 .min().min() 和 .max().max() 并确保您获取的是整个 DataFrame 的最小值或最大值。这意味着这些提取表中所有单元格的最小值和最大值的标量值,而不是这些值的序列。

© www.soinside.com 2019 - 2024. All rights reserved.