pyplot 散布図マーカーサイズ 質問する

pyplot 散布図マーカーサイズ 質問する

散布図の 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

ベストアンサー1

これはサイズを定義する方法としては少々わかりにくいかもしれませんが、基本的にはマーカーの面積sを指定していることになります。つまり、マーカーの幅 (または高さ) を 2 倍にするには、4 倍に増やす必要があります。 [A = W H => (2W) (2H)=4A であるため]

ただし、マーカーのサイズがこのように定義されているのには理由があります。面積は幅の 2 乗で拡大縮小されるため、幅を 2 ​​倍にすると、サイズは実際には 2 倍以上 (実際には 4 倍) 増加するように見えます。これを確認するには、次の 2 つの例と、それらが生成する出力を検討してください。

# 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 からのコメントへの返信)

おそらく私の言葉遣いが混乱を招いているのでしょう。質問は円の幅を 2 ​​倍にすることについてでしたので、最初の図では各円 (左から右に移動) の幅が前の円の 2 倍になっているため、面積は底が 4 の指数関数になります。同様に、2 番目の例では各円の面積がの円の 2 倍になっているため、底が 2 の指数関数になります。

ただし、面積を 2 倍にすると、円が目には 2 倍の大きさに見えるのは、2 番目の例 (面積を拡大縮小する場合) です。したがって、円を 1 倍大きく見せたい場合は、半径ではなくn係数で面積を大きくしn、見かけの大きさが面積に比例するようにします。

@TomaszGandor のコメントを視覚化するために編集します:

マーカー サイズのさまざまな関数は次のようになります。

指数、平方、または線形サイズ

x = [0,2,4,6,8,10,12,14,16,18]
s_exp = [20*2**n for n in range(len(x))]
s_square = [20*n**2 for n in range(len(x))]
s_linear = [20*n for n in range(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_square, label='$s=n^2$')
plt.scatter(x,[-1]*len(x),s=s_linear, label='$s=n$')
plt.ylim(-1.5,1.5)
plt.legend(loc='center left', bbox_to_anchor=(1.1, 0.5), labelspacing=3)
plt.show()

おすすめ記事