1. ホーム
  2. matplotlib

[解決済み】pyplot 散布図 マーカーの大きさ

2022-04-16 05:59:44

質問

散布図の 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: サイズ(points^2)。スカラーまたは x, y と同じ長さの配列である。

はどのような単位ですか? points^2 ? それはどういう意味ですか?また s=100 というのは 10 pixel x 10 pixel ?

基本的に、私は異なるマーカーサイズの散布図を作ろうとしているのですが、その際に s の数値が意味します。

解き方は?

これは、サイズを定義する方法としてはやや分かりにくいかもしれませんが、基本的に 領域 のマーカを作成します。つまり、マーカーの幅 (または高さ) を 2 倍にするためには s を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/2に見せたい場合は n より大きくするには、面積を1倍にして 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()