Matplotlib 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) 标记大小

在散点图的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长度相同的数组

什么类型的单位是积分^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()