如何从 python 中的两个一维数组绘制相似度热图?
How to draw a heatmap of similarity from two one dimensional arrays in python?
我有如下两个数组,
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 不接近——应该是较浅的颜色,等等。知道从哪里开始吗?谢谢。
您的数据代表什么?有很多方法可以比较事物并确定它们是否不同。您可以计算差异、比率等。如果没有更多的上下文,就没有正确的方法来解决您的问题。
如果你的两个值应该成比例,我会将它们绘制为散点图,每个值都作为轴
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')
import seaborn as sns
ax = sns.regplot(data=df, x='a', y='b', robust=True)
如果您真的想使用热图,我会选择 clustermap,因为这会将相似值和不同值聚集在一起:
sns.clustermap(df)
使用annot=True
参数显示值:
Scikit-learn 有一个方便的 function 来计算成对距离。您只需要重塑数组,因为它需要二维数组作为输入。然后我也会按照 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)))));
我有如下两个数组,
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 不接近——应该是较浅的颜色,等等。知道从哪里开始吗?谢谢。
您的数据代表什么?有很多方法可以比较事物并确定它们是否不同。您可以计算差异、比率等。如果没有更多的上下文,就没有正确的方法来解决您的问题。
如果你的两个值应该成比例,我会将它们绘制为散点图,每个值都作为轴
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')
import seaborn as sns
ax = sns.regplot(data=df, x='a', y='b', robust=True)
如果您真的想使用热图,我会选择 clustermap,因为这会将相似值和不同值聚集在一起:
sns.clustermap(df)
使用annot=True
参数显示值:
Scikit-learn 有一个方便的 function 来计算成对距离。您只需要重塑数组,因为它需要二维数组作为输入。然后我也会按照 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)))));