因为这里的其他答案声称s
表示标记的区域,所以我添加了这个答案以澄清情况不一定如此。
以点为单位的大小^2
s
中的参数plt.scatter
表示markersize**2
. 正如文件所说
s
:标量或类似数组,形状(n,),可选
大小,以点^2为单位。默认为 rcParams['lines.markersize'] ** 2。
这可以从字面上理解。为了获得一个 x 点大的标记,您需要将该数字平方并将其提供给s
参数。
所以线图的标记大小和散点大小参数之间的关系是正方形。为了生成与大小为 10 点的绘图标记相同大小的散点标记,您可以调用scatter( .., s=100)
.
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot([0],[0], marker="o", markersize=10)
ax.plot([0.07,0.93],[0,0], linewidth=10)
ax.scatter([1],[0], s=100)
ax.plot([0],[1], marker="o", markersize=22)
ax.plot([0.14,0.86],[1,1], linewidth=22)
ax.scatter([1],[1], s=22**2)
plt.show()
连接到“区域”
那么为什么其他答案甚至文档在涉及参数时都谈到“区域” s
?
当然点**2的单位是面积单位。
- 对于方形标记的特殊情况,标记
marker="s"
的面积确实直接是s
参数的值。
- 对于一个圆,圆的面积是
area = pi/4*s
。
- 对于其他标记,甚至可能与标记的区域没有任何明显的关系。
s
然而,在所有情况下,标记的面积都与参数成比例。这就是将其称为“区域”的动机,尽管在大多数情况下并非如此。
到目前为止,根据与标记面积成比例的某个量来指定散射标记的大小是有意义的,因为当比较不同的斑块而不是其边长或直径时,感知到的是标记的面积。即,将基础数量加倍应该使标记的面积加倍。
什么是积分?
到目前为止,散布标记的大小意味着什么的答案是以点为单位给出的。点通常用于排版,其中字体以点指定。线宽通常以点为单位指定。matplotlib 中点的标准大小是每英寸 72 点 (ppi) - 1 点因此是 1/72 英寸。
能够以像素而不是点为单位指定大小可能很有用。如果图形 dpi 也是 72,则 1 点是 1 个像素。如果图形dpi不同(matplotlib默认为fig.dpi=100
),
1 point == fig.dpi/72. pixels
虽然散点标记的点大小因此对于不同的图形 dpi 看起来会有所不同,但可以生成一个 10 x 10 像素^2 的标记,它总是覆盖相同数量的像素:
import matplotlib.pyplot as plt
for dpi in [72,100,144]:
fig,ax = plt.subplots(figsize=(1.5,2), dpi=dpi)
ax.set_title("fig.dpi={}".format(dpi))
ax.set_ylim(-3,3)
ax.set_xlim(-2,2)
ax.scatter([0],[1], s=10**2,
marker="s", linewidth=0, label="100 points^2")
ax.scatter([1],[1], s=(10*72./fig.dpi)**2,
marker="s", linewidth=0, label="100 pixels^2")
ax.legend(loc=8,framealpha=1, fontsize=8)
fig.savefig("fig{}.png".format(dpi), bbox_inches="tight")
plt.show()
如果您对数据单元的分散感兴趣,请查看此答案。