pyplot散点图标记大小

LWZ*_*LWZ 318 scatter matplotlib marker

在散点图的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)
Run Code Online (Sandbox Code Playgroud)

标记大小

s:以磅为单位的大小^ 2.它是一个标量或与x和y长度相同的数组.

什么样的单位points^2?这是什么意思?是否s=100意味10 pixel x 10 pixel

基本上我正在尝试制作具有不同标记大小的散点图,我想弄清楚这个s数字是什么意思.

Dan*_*Dan 350

这可能是一种有点混乱的定义大小的方法,但您基本上是指定标记的区域.这意味着,要使标记的宽度(或高度)加倍,需要增加s4倍.[因为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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意尺寸如何快速增加.相反,我们有

# 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在,标记的表观尺寸以直观的方式大致线性增加.

至于"点"是什么的确切含义,对于绘图目的而言,它是相当随意的,你可以通过常量来缩放所有大小,直到它们看起来合理.

希望这可以帮助!

编辑:(回应@Emma的评论)

这可能令我感到困惑.问题是关于圆的宽度加倍,所以在每个圆的第一张图片中(当我们从左向右移动时)它的宽度是前一个的两倍,因此对于该区域,这是基数为4的指数.类似地,第二个例子每个圆的面积是最后一个的两倍,它给出了基数为2的指数.

然而,这是第二个例子(我们正在缩放区域),倍增区域似乎使圆圈成为眼睛的两倍大.因此,如果我们希望圆形看起来n更大,我们会将面积增加一个因子n而不是半径,因此表观尺寸与面积成线性比例.

  • 我可能会误解您的观点,但是在您的第二个示例中,您正在呈指数增加(s = [20,40,80,160,320,640]),并说这给了我们很好的线性外观尺寸增加。如果线性增加大小(例如s = [20,40,60,80,100,120])给我们看似线性的结果,那会更有意义吗? (2认同)
  • 很好的例子(只是必要的东西!)。这不应该是`4 ** n`和`2 ** n`,而是`n ** 4`和`n ** 2`。使用`2 ** n`,第二个图在圆直径方面不是线性缩放的。它仍然走得太快(只是没有那么高)。 (2认同)

Imp*_*est 173

因为这里的其他答案声称s表示标记的区域,我正在添加这个答案以澄清这不一定是这种情况.

分数大小^ 2

参数sin 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()
Run Code Online (Sandbox Code Playgroud)

连接到"区域"

那么为什么其他答案甚至文档都谈到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
Run Code Online (Sandbox Code Playgroud)

虽然散点标记的点大小因此对于不同的图形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() 
Run Code Online (Sandbox Code Playgroud)

如果您对数据单元中的分散感兴趣,请查看此答案.


zha*_*ing 18

您可以使用markersize在plot方法中指定圆的大小

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()
Run Code Online (Sandbox Code Playgroud)

这里开始

在此输入图像描述

  • @Dom我投了赞成票,因为即使我搜索"pyplot plot marker size",这个问题也会成为谷歌的第一个结果,所以这个答案有所帮助. (3认同)
  • 问题是关于散点图,在 matplotlib 中,两个绘图函数具有不同的参数(**markersize** 用于 _plot_,**s** 用于 _scatter_)。所以这个答案不适用。 (2认同)

小智 15

它是标记的区域.我的意思是,如果你有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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我看到这个帖子时,我有同样的疑问,所以我做了这个例子然后我在屏幕上使用了一个标尺来测量半径.


Ike*_*Ike 8

为此,我最初也尝试使用“分散”。经过相当多的浪费时间 - 我决定采用以下解决方案。

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是基于对这个问题的回答