当每个点都有特定的半径大小时,如何为每个点散点图绘制一个圆

时间:2019-04-17 06:43:43

标签: python pca plotly-python

我有一个带有距离矩阵的熊猫镜架,我使用PCA进行调暗。该距离矩阵的数据框具有每个点的标签和大小。

如何使每个散乱点变成一个圆,其大小取决于数据框的大小

````
pca = PCA(n_components=2)
pca.fit(dist)
mds5 = pca.components_

fig = go.Figure()
fig.add_scatter(x = mds5[0],
       y = mds5[1],
       mode = 'markers+text',
       marker= dict(size = 8,
             color= 'blue'
            ),
text= dist.columns.values,
textposition='top right')
````

我需要使散点图看起来像此示例,但是,当我在相关答案中为每个点添加大小时,我无法使圆重叠,并且当它们重叠时,我可以放大,然后将它们不再重叠

听起来很奇怪,但是我需要创建一个逻辑,即如果两个圆重叠,那么半径较小的圆就会消失,所以:

  1. 无论缩放如何如何保持圆大小不变
  2. 如何在python中创建逻辑来取消较小的重叠圆?

enter image description here

1 个答案:

答案 0 :(得分:1)

我仍然不确定要在圆圈大小中反映哪个PCA参数,但是:您要么想要

  • 使用散点图(即ax.scatter())来反映您选择的PCA参数;重新缩放图形时,此尺寸将(并且不应)重新缩放;它也未给出,以(x,y)单位
  • 使用多个size=补丁,其半径以(x,y)单位给出;然后在重新缩放时点重叠是一致,但这可能会导致点变形

以下动画将强调当前的问题: Rescaling different point plots

我想您想要基于plt.Circle((x,y), radius=radius, **kwargs)的解决方案,因为它保持距离 static ,然后您需要“手动”预先计算两个点是否重叠并“手动”删除它们”。您应该能够通过比较点大小(即plt.Circle,即PCA参数)和数据点之间的欧式距离(即radius)来自动执行此操作。

要使用圈子,您可以例如定义一个简写函数:

np.sqrt(dx**2 + dy**2)

,然后使用可选参数(即x和y坐标,颜色等)进行调用:

def my_circle_scatter(ax, x_array, y_array, radius=0.5, **kwargs):
    for x, y in zip(x_array, y_array):
        circle = plt.Circle((x,y), radius=radius, **kwargs)
        ax.add_patch(circle)
    return True

我使用my_circle_scatter(ax, xs, ys, radius=0.2, alpha=.5, color='b') 分别创建图形和子图的地方。