2011-06-28 17 views
53

非常に小さな灰色の点を持つ散布図を作成するためにmatplotlibを使用しようとしています。点密度のため、点は小さくする必要があります。問題は、scatter()関数のマーカーが線と塗りの両方を持つように見えることです。マーカーが小さい場合は、線のみが表示され、塗りは表示されず、線は適切な色ではありません(常に黒です)。matplotlibの小さな散布図マーカーは常に黒です

私はgnuplotのを使用したい正確に何を得ることができます:ポイントPT 0 LC RGB「グレー」とプロット「ノード」

をどのように私は)(matplotlibの散布図を使用して、非常に小さな灰色のポイントを作ることができますか?

答えて

64
scatter([1,2,3], [2,4,5], s=1, facecolor='0.5', lw = 0) 

これは1にmarkersize(S = 1)を設定し、FaceColorとは(LW = 0)0(のFaceColor = '0.5')、及び線幅を灰色に。

+6

をこれは動作しますが、それは他の答えは言及理由で、 '『』' 'にedgecolor'を設定するために、より一般的です:以下に示されたように、あなたがcolor =を使用することができます)「マップすること。 – kwinkunks

+2

実際、Matplotlibのそれ以降のバージョン(2011年に質問をしたときのvougeのものとは対照的)では、キーワード 'color'を使用すると、エッジカラーとfacecolorを同時に設定できます。しかし、この機能は文書化されておらず、減価償却のために提案されており、「色」は線と色を設定するだけで、彩色は設定しません。 – Daan

29

マーカーが顔を(埋めることができない、例えば'+''x')持っていない場合には、edgecolorcの代わりに設定する必要があり、かつlw0すべきではない:

scatter([1,2,3], [2,4,5], marker='+', edgecolor='r') 

次のようになるなし

scatter([1,2,3], [2,4,5], s=1, marker='+', facecolor='0.5', lw = 0) 

エッジ/ラインは表示されないため、何も表示されないためです。

+1

知っておくと便利です。 Docはこれをカバーしていません。 – smci

+0

エッジを着色することは、それを表示しないよりも優れた解決策です。見つけにくいmatplotlibドキュメントで正しい "edgecolor"の代わりに "markeredgecolor"が間違って記述されている – user989762

+0

pandas DataFrameから 'plot.scatter'を呼び出すとき、' markeredgecolor'と 'edgecolor'のどちらも有効なパラメータではありません。 – bli

3

あなたの質問に対する最も簡単な答えは、cパラメータの代わりにcolorパラメータを使用して、マーカー全体の色を設定することです。

それはあなたが結果を比較するときの違いを確認するのは簡単です:

from matplotlib import pyplot as plt 

plt.scatter([1,2,3], [3,1,2], c='0.8') # marker not all gray 

plt.scatter([1,2,3], [3,1,2], color='0.8') # marker all gray 

詳細:あなたがちょうどあなたの全体のマーカーがグレー色の同じ日陰なるようにしたいあなたの簡単なユースケースについては を、あなたは本当に面の色対端の色のようなもの、およびあなたのマーカーがすべての辺またはいくつかの辺といくつかの詰め物として定義されているかどうかについて心配する必要はありません。代わりに、colorパラメータを使用し、マーカー全体が指定した単一の色に設定されることを確認してください。

+0

色が「マッピングする値のシーケンス」(固定パラメータではなく、プロットしている変数の1つ)である場合、これは機能しません。代わりに 'c ='を使用するように非常に具体的に指示するエラーメッセージが表示されます。色が変数であるときに 'color ='の効果を得る方法を知っていますか? – zwol

1

コメントのzwolの質問に対する回答として、私の評判はコメントを残すほど高くはないので、これが必要です。カラーがカラーマップから来た場合(つまり、値のシーケンスから

from matplotlib import pyplot 

x = [1,5,8,9,5] 
y = [4,2,4,7,9] 
numSides = [2,3,1,1,5] 

cmap = pyplot.cm.get_cmap("copper_r") 

min, max = min(numSides), max(numSides) 
for i in range(len(x)): 
    if numSides[i] >= 2: 
     cax = pyplot.scatter(x[i], y[i], marker = '+', s = 100, c = numSides[i], cmap = cmap) 
     cax.set_clim(min, max) 
    elif numSides[i] == 1: 
     pyplot.scatter(x[i], y[i], marker = '.', s = 40, color = cmap(numSides[i])) 

fig = pyplot.gcf() 
fig.set_size_inches(8.4, 6) 
fig.savefig('figure_test.png', dpi = 200) 
pyplot.show()