使用 Matplotlib 绘制散点图,其中点根据点之间的距离进行着色

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

我想用 matplotlib 绘制几个散点图,其中的点根据它们之间的距离自动着色。 这个想法是,例程能够计算到一个点和所有其他点的平均距离,对所有点执行此计算,并比较第 n 个点和其他点之间的平均距离。具有最小平均距离的点应使用用户设置的色阶中的最大明亮颜色进行着色(颜色图,例如红色顺序颜色图:https://matplotlib.org/stable/users/explain/colors/colormaps .html),而具有最大平均距离的点与色标的最大阴影颜色。 是否已经有一个函数可以执行我要求的操作并且可以在 matplotlib 中快速使用,或者是否有必要编写一个特定的函数来进行计算?您还可以建议一种不同的计算方法,也许更有效吗?

我想开始的代码如下:

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1,3,4,6,7,9,10,11,13,14,15])
y = np.array([1,3,4,6,7,9,10,11,13,14,15])
plt.scatter(x, y)

x = np.array([6,7,8,9,10,11,12,13,14,15])
y = np.array([1,4,7,10,13,16,19,22,25,28])
plt.scatter(x, y)

plt.show()

嗯,这两个系列的点(蓝色和橙色)应该以用户选择的颜色图的特定颜色着色,但实际上我无法理解如何根据倒数点距离为每个点分配颜色图的颜色,为了以明亮的颜色看到空间上更密集/更接近的点,并以阴影颜色看到空间上较不密集/更接近的点。

python matplotlib scatter-plot
1个回答
0
投票

此方法使用

pairwise_distances
中的
sklearn
函数。您可能需要使用
sklearn
安装
pip install scikit-learn

当前格式告诉您每个数据集的距离比例是多少。如果您按标准化距离 (0-1) 而不是非标准化平均值进行着色,则可以将其减少为单个颜色条。

import matplotlib.pyplot as plt
import numpy as np
 
x = np.array([1,3,4,6,7,9,10,11,13,14,15])
y = np.array([1,3,4,6,7,9,10,11,13,14,15])
xy_set1 = np.column_stack([x, y])
plt.scatter(x, y, s=100, marker='s', color='darkslategray', label='set1')

x = np.array([6,7,8,9,10,11,12,13,14,15])
y = np.array([1,4,7,10,13,16,19,22,25,28])
xy_set2 = np.column_stack([x, y])
plt.scatter(x, y, s=100, marker='o', color='darkslategray', label='set2')

#Calculate distances
# To install sklearn: pip install scikit-learn
from sklearn.metrics import pairwise_distances
distances_matrix = pairwise_distances(xy_set1, xy_set2)
average_distances_set1 = distances_matrix.mean(axis=1)
average_distances_set2 = distances_matrix.mean(axis=0)

#Plot points and colour by distance (use a reversed colour map)
s1 = plt.scatter(xy_set1[:, 0], xy_set1[:, 1], c=average_distances_set1, s=20, marker='s', cmap='Reds_r')
plt.colorbar(label='distance | set 1')

s2 = plt.scatter(xy_set2[:, 0], xy_set2[:, 1], c=average_distances_set2, s=20, marker='o', cmap='Reds_r')
plt.colorbar(label='distance | set 2')

plt.legend()
plt.gcf().set_size_inches(5, 3)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.