Matplotlib pyplot散点图标记大小
在散点图的pyplot文档中:Matplotlib pyplot散点图标记大小,matplotlib,marker,scatter,Matplotlib,Marker,Scatter,在散点图的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) 标记大小
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长度相同的数组
什么类型的单位是积分^2?这是什么意思?s=100
是否表示10像素x 10像素
基本上,我试图用不同的标记大小绘制散点图,我想弄清楚
s
数字的含义。这可能是定义大小的一种有点混乱的方式,但基本上是指定标记的区域。这意味着,要将标记的宽度(或高度)增加一倍,您需要将s
增加4倍。[因为A=WH=>(2W)(2H)=4A]
然而,标记的大小是这样定义的,这是有原因的。由于面积按宽度的平方进行缩放,因此将宽度加倍实际上会使大小增加2倍以上(事实上,它会增加4倍)。要看到这一点,请考虑下面两个例子和它们产生的输出。
#标记宽度加倍
x=[0,2,4,6,8,10]
y=[0]*len(x)
s=[20*4**n表示范围内的n(len(x))]
plt.散射(x,y,s=s)
plt.show()
给予
请注意大小是如何快速增加的。如果我们有
#标记面积加倍
x=[0,2,4,6,8,10]
y=[0]*len(x)
s=[20*2**n表示范围内的n(len(x))]
plt.散射(x,y,s=s)
plt.show()
给予
现在,标记的表观大小以直观的方式大致呈线性增加
至于“点”的确切含义,对于绘图而言,它是相当任意的,您可以通过一个常量缩放所有大小,直到它们看起来合理为止
希望这有帮助
编辑:(回应@Emma的评论)
对我来说,这可能是一个令人困惑的措辞。这个问题是关于将一个圆的宽度增加一倍,所以在第一张图片中,每个圆的宽度是前一个的两倍(从左向右移动),所以对于这个区域,这是一个以4为底的指数。类似地,第二个例子中,每个圆的面积都是最后一个圆的两倍,最后一个圆的面积是以2为底的指数
然而,这是第二个例子(我们在缩放区域),加倍的区域似乎会使圆看起来比眼睛大两倍。因此,如果我们希望一个圆的系数n
更大,我们将增加一个系数n
而不是半径,因此表观尺寸与面积成线性比例
编辑以可视化@TomaszGandor的评论:
这是标记大小的不同功能的外观:
x=[0,2,4,6,8,10,12,14,16,18]
s_exp=[20*2**n表示范围内的n(len(x))]
s_平方=[20*n**2表示范围内的n(len(x))]
s_线性=[20*n表示范围内的n(len(x))]
plt.scatter(x[1]*len(x),s=s_exp,label='$s=2^n$',lw=1)
plt.scatter(x,[0]*len(x),s=s_平方,label='$s=n^2$'))
plt.scatter(x,[-1]*len(x),s=s_线性,标签='s=n$')
plt.ylim(-1.5,1.5)
plt.图例(loc='中左',bbox_至_锚=(1.1,0.5),标签间距=3)
plt.show()
如果圆的大小对应于s=parameter
中参数的平方,则为附加到大小数组中的每个元素指定一个平方根,如下所示:s=[1,1.414,1.73,2.0,2.24]
这样当它获取这些值并返回它们时,它们的相对大小增加将是平方级数的平方根,它返回一个线性级数
如果我在输出到绘图时对每一个进行平方运算:output=[1,2,3,4,5]
。尝试列表解释:s=[numpy.sqrt(i)表示s中的i]
它是标记的区域。我的意思是如果你有s1=1000
然后s2=4000
,每个圆的半径之间的关系是:r\u s2=2*r\u 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')
当我看到这篇文章时,我也有同样的疑问,所以我做了这个例子,然后用屏幕上的尺子测量半径 您可以使用标记化在绘图方法中指定圆的大小
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()
从
我最初也尝试使用“分散”来实现这一目的。在浪费了相当多的时间之后,我决定采用以下解决方案
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)
这是基于对的回答,因为这里的其他回答声称,s
表示标记的区域,我添加这个回答是为了澄清情况并非如此
大小以点^2为单位
plt.scatter
中的参数s
表示标记大小**2
。正如文件所说
s
:标量或类似数组的形状(n,),可选大小以点^2为单位。默认值为rcParams['lines.markersize']**2 这可以从字面上理解。为了获得x点大的标记,需要将该数字平方,并将其赋给
s
参数
因此,直线图的标记大小和散射大小参数之间的关系是平方关系。为了生成一个与10点大小的绘图标记大小相同的散布标记,您可以调用散布(..,s=100)
连接到“区域”
那么,为什么其他答案甚至文档在谈到s
参数时都提到“区域”
当然,点**2的单位是面积单位
- 对于方形标记的特殊情况,
,标记的面积实际上直接等于marker=“s”
参数的值李>s
- 对于圆,圆的面积为
李>area=pi/4*s
- 对于其他标记,甚至可能与标记的面积没有任何明显的关系李>
s
参数成比例。这就是将其称为“区域”的动机,即使在大多数c语言中也是如此
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()
1 point == fig.dpi/72. pixels
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()