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

How to plot a circle for each point scatter plot while each has particular radius size

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

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

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

下面的动画将强调手头的问题:

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

要使用 Circles,您可以例如定义一个 shorthand 函数:

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() 单独创建图形和子图的地方。