首页 > 解决方案 > 以分类值作为标签的热图

问题描述

鉴于我的数据的以下子集

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'

标签: pythonmatplotlibseaborn

解决方案


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

由于您的数据似乎是 x,y 位置,因此将它们用作散点图中的坐标是有意义的。您可以根据 Yes/Maybe/No 值为 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')

推荐阅读