温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Heatmap with Categorical value as label
matplotlib python seaborn

python - 以分类值作为标签的热图

发布于 2020-03-30 21:29:39

给定我的数据的以下子集

import matplotlib.pyplot as plt
import numpy as np
data = np.array([['Yes', 'No', 'No', 'Maybe', 'Yes', 'Yes', 'Yes'],
                    [0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
                    [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]])

我想绘制第二行和第三行的热图,并使用第一行作为每个框中的标签。我尝试使用,plt.imshow()但是一旦使用了完整的数据集,它就会失败,并且找不到在每个框中将分类值作为标签合并的方法。

另一方面,如果我这样做:

data1 = np.array([[0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
                    [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]])

plt.imshow(data1, cmap='hot', interpolation='nearest')

我得到了一个热图,但是它并不能很好地描述我想要的内容,因为缺少标签和轴。有什么建议?

在此处输入图片说明

列名是 'Decision', 'Percentage', 'Salary multiplier'

查看更多

提问者
Mixalis
被浏览
58
JohanC 2020-01-31 21:15

首先,一个np.array需要所有元素都具有相同的类型。由于数组还包含字符串,因此将其设为通用类型。因此,最好不要将数组作为np.array或对字符串使用单独的数组。

由于您的数据似乎是x,y位置,因此将它们用作散点图中的坐标是有意义的。您可以根据是/可能/否值为x,y位置上色,例如为它们分配绿色/黄色/红色。此外,由于数据很少,您可以添加文本。有了更多的数据,您最好创建一个图例以将标签与其颜色连接起来。

from matplotlib import pyplot as plt
import numpy as np

data = [['Yes', 'No', 'No', 'Maybe', 'Yes', 'Yes', 'Yes'],
        [0.21, 0.62, 0.56, 0.48, 0.32, 0.71, 0.01],
        [1.1053, 1.5412, 1.4333, 1.1433, 1.1098, 1.1003, 1.2032]]

answer_to_color = {'Yes': 'limegreen', 'Maybe': 'gold', 'No': 'crimson'}
colors = [answer_to_color[ans] for ans in data[0]]
plt.scatter(data[1], data[2], c=colors, s=500, ls='-', edgecolors='black')

for label, x, y in zip(data[0], data[1], data[2]):
    plt.text(x+0.01, y+0.03, label)
plt.show()

结果

要使用列名来标记图形,可以添加:

plt.title('Decision')
plt.xlabel('Percentage')
plt.ylabel('Salary multiplier')