【问题标题】:How to plot a circle for each point scatter plot while each has particular radius size如何为每个点散点图绘制一个圆,而每个圆都有特定的半径大小
【发布时间】:2019-04-17 06:43:43
【问题描述】:

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

【问题讨论】:

标签: python pca plotly-python


【解决方案1】:

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

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

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

我想你想要基于plt.Circle 的解决方案,因为它保持距离静态,然后你需要事先“手动”计算两个点是否重叠并“手动”删除它们。您应该能够通过点大小(即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() 分别创建图形和子图。

【讨论】:

  • 半径与 PCA 或 x,y 无关,而是自变量。有多个plt.Circle((x,y), radius=radius, **kwargs) 是否需要循环?抱歉,**kwargs 代表什么?
  • @JayQadan **kwargs 是任何其他 keywarguments 的占位符 你可能会通过,例如color="r"。我已经更新了我的答案以包含Circle() 的示例
  • 如果你有很多圈子,你可能要考虑使用circle collection
猜你喜欢
  • 2011-01-14
  • 2014-02-01
  • 2020-06-25
  • 2014-01-12
  • 2014-02-19
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多