web-dev-qa-db-ja.com

散布図プロトコルのマーカーサイズ

散布図の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=10010 pixel x 10 pixelを意味しますか?

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

267
LWZ

これはサイズを定義するにはやや複雑な方法ですが、基本的にはマーカーの area を指定します。つまり、マーカーの幅(または高さ)を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()

与える

enter image description here

サイズが急激に大きくなる様子に注目してください。代わりに我々は持っている場合

# 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()

与える

enter image description here

現在、マーカーの見かけのサイズは直感的に直線的に大きくなります。

'点'が何であるかの正確な意味に関しては、それはプロット目的のためにかなり恣意的です、あなたはそれらが合理的に見えるまで定数であなたのサイズの全てをスケーリングすることができます。

お役に立てれば!

編集: (@Emmaからのコメントへの返信)

それはおそらく私の側の表現を混乱させます。円の幅を2倍にすることについて質問しました(左から右に移動するにつれて)各円の最初の図では、幅は前の幅の2倍になっています。各円は area 最後の円の2倍で、基数2の指数を与えます。

しかし、2倍の領域が円を目に2倍大きくしているように見えるのは、2番目の例です(ここでは、領域をスケーリングしています)。したがって、円をnの係数より大きく表示する場合は、半径ではなく係数nで領域を増やすため、見かけのサイズは領域に比例して増減します。

302
Dan

ここの他の回答はsがマーカーの領域を表すと主張しているので、これが必ずしも当てはまるわけではないことを明確にするためにこの回答を追加します。

ポイントサイズ^ 2

plt.scatterの引数smarkersize**2を表します。ドキュメンテーションが言うように

s:スカラーまたはarray_like、形状(n、)、オプション
ポイントのサイズ^ 2。デフォルトはrcParams ['lines.markersize'] ** 2です。

これは文字通りとらえることができます。 xポイントの大きさのマーカーを取得するには、その数を二乗してs引数に渡す必要があります。

そのため、折れ線グラフのマーカーサイズと散布サイズの引数の関係は正方形になります。サイズ10ポイントのプロットマーカーと同じサイズの散布マーカーを作成するには、scatter( .., s=100)と呼びます。

enter image description here

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()

「地域」へのつながり

それではsパラメータに関して他の答えやドキュメンテーションでも "area"について語っているのはなぜでしょうか。

もちろん、ポイントの単位** 2は面積の単位です。

  • 正方形マーカーの特別な場合marker="s"では、マーカーの面積は実際には直接sパラメーターの値です。
  • 円の場合、円の面積はarea = pi/4*sです。
  • 他のマーカーの場合、マーカーの領域との明らかな関係さえないかもしれません。

enter image description here

すべての場合において、マーカーの面積はsパラメータ に比例します。ほとんどの場合それは実際ではありませんが、これはそれを「エリア」と呼ぶ動機です。

マーカーの面積に比例する量で散乱マーカーのサイズを指定することは、その長さや直径ではなく、異なるパッチを比較するときに認識されるのはマーカーの面積であるため、これまでのところ意味があります。すなわち基礎となる量を2倍にすると、マーカーの面積は2倍になります。

enter image description here

ポイントは何ですか?

これまでのところ、スキャターマーカーのサイズが何を意味するかに対する答えは、ポイントの単位で与えられます。フォントはポイント単位で指定されるため、ポイントは活版印刷でよく使用されます。線幅もポイント単位で指定されることがよくあります。 matplotlibのポイントの標準サイズは72ポイント/インチ(ppi)です。つまり1ポイントは1/72インチです。

ポイントではなくピクセル単位でサイズを指定できると便利な場合があります。 Figureのdpiが72の場合も、1ポイントは1ピクセルです。 Figureのdpiが異なる場合(matplotlibのデフォルトはfig.dpi=100)、

1 point == fig.dpi/72. pixels

点のスキャッタマーカーのサイズは、異なるFigure dpiで異なるように見えますが、10×10ピクセル^ 2のマーカーを作成できます。これは、常に同じピクセル数をカバーすることになります。

enter image description here enter image description here enter image description here

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() 

データ単位の散布に興味があるなら、 この答え をチェックしてください。

プロットメソッドで円の大きさを指定するために markerize を使うことができます

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()

ここから

enter image description here

15
zhaoqing

それはマーカーの area です。 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')

enter image description here

私がポストを見たとき私も同じ疑問を抱いていた、それで私はこの例をしたそれから私は半径を測定するためにスクリーンの支配者を使った。

14
Joaquin

私はまたこの目的のために最初に 'scatter'を使用しようとしました。かなりの時間を無駄にした後 - 私は次の解決策を選びました。

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)

enter image description here

これは この質問への回答に基づいています

3
Ike

円のサイズがs=parameterのパラメータの平方に対応する場合は、次のように、サイズ配列に追加する各要素に平方根を割り当てます。s=[1, 1.414, 1.73, 2.0, 2.24]を使用すると、これらの値を取得してそれらの相対サイズが増加します。は、2乗累乗の平方根になります。これは、線形累進を返します。

プロットに出力されるときにそれぞれを二乗すると、output=[1, 2, 3, 4, 5]になります。リストの解釈を試してください:s=[numpy.sqrt(i) for i in s]

1
user34028