Matplotlib圆形标记的面积如何与其半径成比例?

时间:2015-11-26 17:13:21

标签: python matplotlib

圆形标记的面积如何与Matplotlib中的标记半径成比例?我希望它可以缩放为pi倍半径的平方,但事实并非如此。

我正在尝试创建一个数字来显示N个圈子的紧密分布。这种分布恰好是规则的(它是六边形的),因此很容易知道每个圆心的位置。我使用matplotlib.pyplot.scatter()使用matplotlib/lib/matplotlib/markers.py中的圆圈标记来绘制这些圆圈。

现在为了紧密包装圆圈,我需要设置圆形标记的区域,以便它们精确地相互接触。如果我将标记区域设置为numpy.pi*(L/2)**2,其中L是每个圆的直径(以磅为单位),我希望会发生这种情况,如果它们要精确地触摸,则等于两个圆之间的距离。但是这results in a plot in which the circles overlap。以下是生成此图的代码:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

f = plt.figure(figsize=(7, 7), dpi=100)
ax = f.add_subplot(1,1,1)
ax.set_ylim(-105,105)
ax.set_xlim(-105,105)

L = 14.0 # Diameter of a circle in data units 
# marker_radius is L/2 in points.
marker_radius = (ax.transData.transform((0,0))
                 -ax.transData.transform((L/2,0)))[0]
marker_area = np.pi*marker_radius**2
ax.scatter(x, y, color='#7fc97f', edgecolors='None', s=marker_area)

plt.savefig('figure.png',bbox_inches='tight')

显然,matplotlib/lib/matplotlib/markers.py中圆形标记的面积不会缩放为pi乘以半径的平方(应该如此)。经过反复试验,我发现它实际上缩放为大约2.3倍的半径平方。当我将marker_area设置为2.3*marker_radius**2时,我得到a closely packed distribution as required

我想知道是否有人可以评论为什么圆形标记尺寸以这种特殊的方式缩放。另外,精确缩放是什么?真的是2.3吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我快速尝试了this代码(仅将标记从s更改为o),并且从中可以看出标记大小的平方根等于直径(在<圈子中的em> points ,请参阅我提到的帖子:

enter image description here

来自文档:

  

s:标量或array_like,shape(n,),可选,默认值:20个点的大小^ 2。