散布図の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
数が何を意味するのか理解したいです。
これはサイズを定義するにはやや複雑な方法ですが、基本的にはマーカーの 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()
与える
サイズが急激に大きくなる様子に注目してください。代わりに我々は持っている場合
# 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倍になっています。各円は area 最後の円の2倍で、基数2の指数を与えます。
しかし、2倍の領域が円を目に2倍大きくしているように見えるのは、2番目の例です(ここでは、領域をスケーリングしています)。したがって、円をn
の係数より大きく表示する場合は、半径ではなく係数n
で領域を増やすため、見かけのサイズは領域に比例して増減します。
ここの他の回答はs
がマーカーの領域を表すと主張しているので、これが必ずしも当てはまるわけではないことを明確にするためにこの回答を追加します。
plt.scatter
の引数s
はmarkersize**2
を表します。ドキュメンテーションが言うように
s
:スカラーまたはarray_like、形状(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()
それではs
パラメータに関して他の答えやドキュメンテーションでも "area"について語っているのはなぜでしょうか。
もちろん、ポイントの単位** 2は面積の単位です。
marker="s"
では、マーカーの面積は実際には直接s
パラメーターの値です。area = pi/4*s
です。 すべての場合において、マーカーの面積はs
パラメータ に比例します。ほとんどの場合それは実際ではありませんが、これはそれを「エリア」と呼ぶ動機です。
マーカーの面積に比例する量で散乱マーカーのサイズを指定することは、その長さや直径ではなく、異なるパッチを比較するときに認識されるのはマーカーの面積であるため、これまでのところ意味があります。すなわち基礎となる量を2倍にすると、マーカーの面積は2倍になります。
これまでのところ、スキャターマーカーのサイズが何を意味するかに対する答えは、ポイントの単位で与えられます。フォントはポイント単位で指定されるため、ポイントは活版印刷でよく使用されます。線幅もポイント単位で指定されることがよくあります。 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のマーカーを作成できます。これは、常に同じピクセル数をカバーすることになります。
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()
それはマーカーの 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')
私がポストを見たとき私も同じ疑問を抱いていた、それで私はこの例をしたそれから私は半径を測定するためにスクリーンの支配者を使った。
私はまたこの目的のために最初に '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)
これは この質問への回答に基づいています
円のサイズが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]