由于此处的其他答案要求s
表示标记的区域,因此我添加此答案以明确说明不一定是这种情况。
磅数^ 2
的参数s
中plt.scatter
表示markersize**2
。如文档所述
s
:标量或类似array_,形状(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,则一点就是一个像素。如果数字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()
如果您对散布数据单位感兴趣,请查看此答案。