python散点图区域大小比例轴长度

我对此非常绝望,到目前为止我在www上找不到任何东西 .

情况如下:

  • 我正在使用Python .

  • 我有3个数组:x坐标,y坐标和半径 .

  • 我想用给定的x坐标和y坐标创建散点图 .

到目前为止,一切都按照我的要求运作 . 这有什么困扰我:

  • 散点图中每个点的圆周大小应由半径数组定义 .

  • 坐标和半径的值以相同的单位表示 . 更明确地说:假设我在(1,1)处指定半径为0.5的点 . 然后我想在以(1,1)为中心的图中得到一个圆,边界通过点(1.5,1),(1,1.5),(0.5,1)和(1,0.5)

我正在努力的是找出绘图点与轴长度的比率 . 我需要使用点,因为据我所知,散点图的圆周大小以点值给出 . 所以,如果我们说我的轴从0到10,我需要知道图中有多少点 .

有谁能够帮我?还是有另一种方法吗?提前致谢 .

回答(1)

2 years ago

我从你的另一个stackoverflow question跳了进来 . 我认为您作为answer to the present question呈现的方法将无法正常工作,原因如下:

  • 首先,标记的大小以点为单位,而不是以像素为单位 . 在排版中,the point是最小的度量单位,在matplotlib中对应于1/72英寸的固定长度 . 相反,像素的大小将根据图形dpi和大小而变化 .

  • 其次, plt.scatter 中标记的大小与圆的直径有关,而与半径无关 .

因此,每个标记的点数大小应计算如下:

size_in_points = (2 * radius_in_pixels / fig_dpi * 72 points/inch)**2

此外,如下面的MWE所示,可以直接用matplotlib transformations计算标记半径的大小,而不必事先生成空图:

import numpy as np
import matplotlib.pyplot as plt

plt.close('all')

# Generate some data :
N = 25
x = np.random.rand(N) + 0.5
y = np.random.rand(N) + 0.5
r = np.random.rand(N)/10

# Plot the data :
fig = plt.figure(facecolor='white', figsize=(7, 7))
ax = fig.add_subplot(111, aspect='equal')
ax.grid(True)
scat = ax.scatter(x, y, s=0, alpha=0.5, clip_on=False)
ax.axis([0, 2, 0, 2])

# Draw figure :
fig.canvas.draw()

# Calculate radius in pixels :
rr_pix = (ax.transData.transform(np.vstack([r, r]).T) -
          ax.transData.transform(np.vstack([np.zeros(N), np.zeros(N)]).T))
rpix, _ = rr_pix.T

# Calculate and update size in points:
size_pt = (2*rpix/fig.dpi*72)**2
scat.set_sizes(size_pt)

# Save and show figure:
fig.savefig('scatter_size_axes.png')
plt.show()

enter image description here

在(1,1)处指定半径为0.5的点将导致图中的圆以(1,1)为中心并且边界通过点(1.5,1),(1,1.5),(0.5, 1)和(1,0.5):

enter image description here