如何从python中的两个一维数组中绘制相似度热图?
Posted
技术标签:
【中文标题】如何从python中的两个一维数组中绘制相似度热图?【英文标题】:How to draw a heatmap of similarity from two one dimensional arrays in python? 【发布时间】:2021-09-16 07:08:12 【问题描述】:我有两个数组如下,
a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])
我希望能够绘制一个热图,显示数组 a 与数组 b 的接近程度。如果可能,在鼠标悬停时显示 a 值和 b 值。例如,数组 a 中的 1 与数组 b 中的 20 不接近——应该是较浅的颜色,等等。知道从哪里开始吗?谢谢。
【问题讨论】:
你可以使用Seaborn 你想要一维的连续地图吗?还是沿一个轴的离散彩色点? @joostblack 我想画一个二维图。在 x 轴上,a 和 y 轴 b - 像这样。你知道怎么去吗? 你想要a中的一个元素到b中所有其他元素的距离,反之亦然吗? 【参考方案1】:Scikit-learn 有一个方便的 function 来计算成对距离。您只需要重塑数组,因为它需要 2d 数组作为输入。然后我也会按照 Eduardo 的建议使用 seaborn。
import numpy as np
from sklearn.metrics import pairwise_distances
import seaborn as sns
a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])
distances = pairwise_distances(X=a.reshape(-1, 1), Y=b.reshape(-1, 1))
sns.heatmap(distances, square=True, annot=True, cbar=False, cmap='Blues');
编辑:要反转颜色,您可以改用颜色图'Blues_r'
。我不知道是否有办法在 seaborn 级别翻转 y 轴,但您始终可以翻转输入数据并相应地更改标签:
distances = pairwise_distances(X=np.flip(a).reshape(-1, 1), Y=b.reshape(-1, 1))
sns.heatmap(distances, square=True, annot=True, cbar=False, cmap='Blues_r',
yticklabels=list(reversed(range(len(a)))));
【讨论】:
谢谢一百万。是否可以翻转y轴?以及如何以翻转顺序设置颜色?例如,10 和 10 应该更暗,因为它是 100% 相同的,20 和 10 是 50% 相似的,等等。 当然,这是可能的。我在答案中添加了一段。 哇!谢谢@Arne。实际上,我的 np 数组很大。我只花了20。它看起来很乱。 a 【参考方案2】:您的数据代表什么?有很多方法可以比较事物并确定它们是否不同。您可以计算差异、比率等。如果没有更多上下文,就没有正确的方法来解决您的问题。
如果您的两个值应该成比例,我会将它们绘制为散点图,每个值都作为轴
import pandas as pd
a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])
df = pd.DataFrame('a': a, 'b': b)
df.plot.scatter(x='a', y='b')
你也可以使用seaborn的regplot:
import seaborn as sns
ax = sns.regplot(data=df, x='a', y='b', robust=True)
如果您真的想使用热图,我会选择 clustermap,因为这会将相似的值和不同的值聚集在一起:
sns.clustermap(df)
使用annot=True
参数显示值:
【讨论】:
谢谢一百万。你提出了一个很好的问题。数组 a 是真实标签,数组 b 是 ML 模型的预测。我想展示模型的表现。因此,如果您有其他想法,请随时告诉。以上是关于如何从python中的两个一维数组中绘制相似度热图?的主要内容,如果未能解决你的问题,请参考以下文章