web-dev-qa-db-ja.com

3番目の変数の関数としてのmatplotlib散布図の色

Matplotlibの散布関数のカラーポイントを3番目の変数で作成する方法を知りたいです。

質問 matplotlibのgnuplot linecolor変数? および Matplotlib scatterplot; 3番目の変数の関数としての色 同様のクエリを提示しましたが、これらの質問に対する答えは私の問題を解決しません:スキャッタ関数でc=arraywhichspecifiespointcolourを使用すると、塗りつぶしの色のみが設定され、エッジの色は設定されません。これは、たとえば、c=arr...を使用しているときにmarkersymbol='+'の使用が失敗することを意味します(マーカーには塗りつぶしがなく、エッジのみがあるため)。どのシンボルが使用されているかに関係なく、ポイントを確実に3番目の変数で色付けする必要があります。

Matplotlibの散布機能でこれを達成する方法はありますか?

25
user1082930

これは私のために、matplotlib 1.1を使用して動作します:

_import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = np.sin(x)

plt.scatter(x, y, marker='+', s=150, linewidths=4, c=y, cmap=plt.cm.coolwarm)
plt.show()
_

結果:

enter image description here

または、nポイントに対して、形状(n、3)でRGBカラー値の配列を作成し、scatter()edgecolorsキーワード引数に割り当てます。

_import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 100)
y = np.sin(x)
z = x + 20 * y

scaled_z = (z - z.min()) / z.ptp()
colors = plt.cm.coolwarm(scaled_z)

plt.scatter(x, y, marker='+', edgecolors=colors, s=150, linewidths=4)
plt.show()
_

結果: enter image description here

その例は、z値を範囲[0,1]にスケーリングし、スケーリングされた値でカラーマップ_plt.cm.coolwarm_を呼び出すことにより、RGBA値を取得します。この方法で呼び出されると、matplotlibカラーマップはRGBA値の配列を返し、各行は対応する入力値の色を提供します。例えば:

_>>> t = np.linspace(0, 1, 5)
>>> t
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
>>> plt.cm.coolwarm(t) 
array([[ 0.2298,  0.2987,  0.7537,  1.    ],
       [ 0.5543,  0.6901,  0.9955,  1.    ],
       [ 0.8674,  0.8644,  0.8626,  1.    ],
       [ 0.9567,  0.598 ,  0.4773,  1.    ],
       [ 0.7057,  0.0156,  0.1502,  1.    ]])
_
29