在散点图的pyplot文档中:
matplotlib.pyplot.scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None,
faceted=True, verts=None, hold=None, **kwargs)
标记尺寸
S: 大小以点^ 2。它是一个标量或长度与x和y相同的数组。
points^2
是什么类型的单位?这是什么意思? s=100
是10 pixel x 10 pixel
吗?
基本上我正在尝试制作具有不同标记大小的散点图,我想弄清楚s
数字的含义。
答案 0 :(得分:305)
这可能是一种有点令人困惑的定义大小的方法,但您基本上是指定标记的区域。这意味着,要使标记的宽度(或高度)加倍,需要将s
增加4倍。[因为A = W H => (2W)(2H)= 4A]
然而,有一个原因是标记的大小是以这种方式定义的。由于区域缩放为宽度的平方,实际上加倍宽度实际上会使尺寸增加超过2倍(实际上它增加了4倍)。要看到这一点,请考虑以下两个示例及其产生的输出。
# doubling the width of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*4**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()
给出
注意尺寸如何快速增加。相反,我们有
# doubling the area of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()
给出
现在,标记的表观大小以直观的方式大致线性增加。
至于“点”的确切含义,对于绘图目的而言,它是相当随意的,你可以用一个常数来缩放所有大小,直到它们看起来合理。
希望这有帮助!
编辑:(回应@Emma的评论)
这可能令我感到困惑。问题是关于圆的宽度加倍,所以在每个圆的第一张图片中(当我们从左向右移动时)它的宽度是前一个的两倍,因此对于该区域,这是基数为4的指数。类似地,第二个例子每个圆圈的区域是最后一个的两倍,它给出了基数为2的指数。
然而,这是第二个例子(我们正在缩放区域),倍增区域似乎使圆圈成为眼睛的两倍大。因此,如果我们想要一个圆圈显示n
更大的因子,我们会将面积增加一个因子n
而不是半径,因此表观尺寸与该面积呈线性关系。
答案 1 :(得分:130)
因为此处的其他答案声称s
表示标记的区域,所以我添加此答案以明确不一定是这种情况。
s
中的参数plt.scatter
表示markersize**2
。正如文档所说
s
:标量或array_like,shape(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()
那么为什么其他答案甚至文档都会谈到" area"什么时候涉及s
参数?
当然,积分** 2的单位是面积单位。
marker="s"
,标记的区域确实直接是s
参数的值。 area = pi/4*s
。 但在所有情况下,标记的区域都与s
参数成比例。这就是把它称为" area"尽管在大多数情况下它并不是真的。
根据与标记区域成比例的某些数量来指定散点标记的大小,这在很远的意义上是因为它是比较不同的补丁而不是其边长时所感知的标记区域。直径。即将基础数量加倍应该使标记的面积加倍。
到目前为止,分散标记大小的答案以点为单位给出。点通常用于排版,其中字体以点指定。线宽通常也以点数指定。 matplotlib中标准尺寸的点数是每英寸72点(ppi) - 因此1点是1/72英寸。
能够以像素而不是点数指定尺寸可能很有用。如果图形dpi也是72,则一个点是一个像素。如果数字dpi不同(matplotlib默认为fig.dpi=100
),
1 point == fig.dpi/72. pixels
虽然散点标记的点大小因此对于不同的图dpi看起来不同,但是可以产生10乘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()
如果您对数据单元的分散感兴趣,请查看this answer。
答案 2 :(得分:16)
您可以使用 markersize 在绘图方法
中指定圆的大小import numpy as np
import matplotlib.pyplot as plt
x1 = np.random.randn(20)
x2 = np.random.randn(20)
plt.figure(1)
# you can specify the marker size two ways directly:
plt.plot(x1, 'bo', markersize=20) # blue circle with size 10
plt.plot(x2, 'ro', ms=10,) # ms is just an alias for markersize
plt.show()
来自here
答案 3 :(得分:14)
标记的区域。我的意思是,如果您有s1 = 1000
然后s2 = 4000
,则每个圆的半径之间的关系为:r_s2 = 2 * r_s1
。见下图:
plt.scatter(2, 1, s=4000, c='r')
plt.scatter(2, 1, s=1000 ,c='b')
plt.scatter(2, 1, s=10, c='g')
当我看到这个帖子时,我有同样的疑问,所以我做了这个例子,然后我在屏幕上用尺子来测量半径。
答案 4 :(得分:3)
我还试图使用' scatter'最初为此目的。经过相当多的浪费时间 - 我决定采用以下解决方案。
import matplotlib.pyplot as plt
input_list = [{'x':100,'y':200,'radius':50, 'color':(0.1,0.2,0.3)}]
output_list = []
for point in input_list:
output_list.append(plt.Circle((point['x'], point['y']), point['radius'], color=point['color'], fill=False))
ax = plt.gca(aspect='equal')
ax.cla()
ax.set_xlim((0, 1000))
ax.set_ylim((0, 1000))
for circle in output_list:
ax.add_artist(circle)
这是基于对this question
的回答答案 5 :(得分:1)
如果圆圈的大小与s=parameter
中参数的平方对应,则为您附加到大小数组的每个元素指定一个平方根,如下所示:s=[1, 1.414, 1.73, 2.0, 2.24]
这样当它获取这些值并返回它们,它们的相对大小增加将是平方进展的平方根,返回线性进展。
如果我在输出到情节时对每一个进行平方:output=[1, 2, 3, 4, 5]
。尝试列表解释:s=[numpy.sqrt(i) for i in s]