0

我有一个带有距离矩阵的熊猫框架,我使用 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中创建一个逻辑来取消较小的重叠圆?

在此处输入图像描述

4

1 回答 1

4

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

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

以下动画将强调手头的问题: 重新缩放不同的点图

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

要使用 Circles,您可以定义一个速记函数:

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

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

my_circle_scatter(ax, xs, ys, radius=0.2, alpha=.5, color='b')

我用来fig,ax=plt.subplots()单独创建图形和子图的地方。

于 2019-04-18T07:20:46.760 回答