2012-09-02 3 views
95

に散布図に各シリーズごとに異なる色を設定する:私は10セットでこれを行うことができますどのようには、私は3つのデータセットがあるとmatplotlibの

from matplotlib import pyplot as plt 
plt.scatter(X,Y1,color='red') 
plt.scatter(X,Y2,color='blue') 
plt.show() 

X = [1,2,3,4] 
Y1 = [4,8,12,16] 
Y2 = [1,4,9,16] 

私はこのプロットを散乱することができますか?

私はこれを検索して、私が求めていることへの参照を見つけることができました。

編集:明確化(うまくいけば)私の質問

私は散布を複数回呼び出す場合、私は、各スキャッタに同じ色を設定することができます。また、私は手動でカラー配列を設定することができますが、私はこれを行うためのよりよい方法があると確信しています。 私の質問は、私は自動的に散布図にするにはどうすればよい私の複数のデータセット、それぞれを異なる色で」、それからです。

ことができます場合は、私は簡単に設定した各データに固有の番号を割り当てることができます。

+1

ここではどのような疑問がありますか?色は、同様の配列をすることができますが、あなただけの散乱を複数回呼び出すと何を解決することはできませんか? – seberg

+1

私は散布を複数回呼び出す場合、私は同じ色を取得します。私は私の質問を更新します。 – Yotam

答えて

150

I 。あなたがcolourmapを選択し、カラー配列を簡単に十分に行うことができますあなたが「手動」で何を意味するのか分からない:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

x = np.arange(10) 
ys = [i+x+(i*x)**2 for i in range(10)] 

colors = cm.rainbow(np.linspace(0, 1, len(ys))) 
for y, c in zip(ys, colors): 
    plt.scatter(x, y, color=c) 

したり、独自のカラーサイクラーを作るitertools.cycleを使用して、あなたが上でループにしたい色を指定し、 nextを使って、あなたが望むものを手に入れることができます。例えば、私は10色を入力するのが面倒ですS):

colors = itertools.cycle(["r", "b", "g"]) 
for y in ys: 
    plt.scatter(x, y, color=next(colors)) 

考えてみれば、多分それはあまりにも最初のものでzipを使用しないクリーナーです:

colors = iter(cm.rainbow(np.linspace(0, 1, len(ys)))) 
for y in ys: 
    plt.scatter(x, y, color=next(colors)) 

[PS:私は本当に私は「Uをドロップしなければならないことを憎みます'matplotlibを使って作業しているとき]

+1

+1。同じ色を持つ複数のデータセットで終わるので、itertoolsサイクルはおそらくこの状況では良い考えではありません。 –

+1

@DavidRobinson:あなたはすべての10を指定していない場合は、サイクリングの種類は、そこの目的を敗北することに同意します..:^) – DSM

+0

正確に - それはサイクルではありません:) –

27

matplotlibの異なる色の点でプロットをプロットする通常の方法は、色のリストをパラメータとして渡すことです。

例えば:

import matplotlib.pyplot 
matplotlib.pyplot.scatter([1,2,3],[4,5,6],color=['red','green','blue']) 

3 colors

あなたはリストのリストを持っていて、それらをリストごとに色付けしたいとき。 私は最もエレガントな方法は、@ DSMによってsuggesytedされたと思う、 ちょうど散るために複数の呼び出しを行うループを行う。

しかし、あなただけの1コールでそれをやってみたかったいくつかの理由であれば、あなたはリスト内包とフローリング部門のビットで、色の大きなリストを作ることができます。

import matplotlib 
import numpy as np 

X = [1,2,3,4] 
Ys = np.array([[4,8,12,16], 
     [1,4,9,16], 
     [17, 10, 13, 18], 
     [9, 10, 18, 11], 
     [4, 15, 17, 6], 
     [7, 10, 8, 7], 
     [9, 0, 10, 11], 
     [14, 1, 15, 5], 
     [8, 15, 9, 14], 
     [20, 7, 1, 5]]) 
nCols = len(X) 
nRows = Ys.shape[0] 

colors = matplotlib.cm.rainbow(np.linspace(0, 1, len(Ys))) 

cs = [colors[i//len(X)] for i in range(len(Ys)*len(X))] #could be done with numpy's repmat 
Xs=X*nRows #use list multiplication for repetition 
matplotlib.pyplot.scatter(Xs,Ys.flatten(),color=cs) 

All plotted

cs = [array([ 0.5, 0. , 1. , 1. ]), 
array([ 0.5, 0. , 1. , 1. ]), 
array([ 0.5, 0. , 1. , 1. ]), 
array([ 0.5, 0. , 1. , 1. ]), 
array([ 0.28039216, 0.33815827, 0.98516223, 1.  ]), 
array([ 0.28039216, 0.33815827, 0.98516223, 1.  ]), 
array([ 0.28039216, 0.33815827, 0.98516223, 1.  ]), 
array([ 0.28039216, 0.33815827, 0.98516223, 1.  ]), 
... 
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17, 
      1.00000000e+00]), 
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17, 
      1.00000000e+00]), 
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17, 
      1.00000000e+00]), 
array([ 1.00000000e+00, 1.22464680e-16, 6.12323400e-17, 
      1.00000000e+00])] 
6

この質問は、2013年1月より少し難解で、matplotlib 1.3.1(2012年8月)はmatpplotlibウェブサイトで最も古い安定版です。しかしその後、それはかなり簡単です。

ためmatplotlib.pylab.scatter支持割り当ての現在のバージョン:色名文字列、カラーマップ、RGBまたはRGBAの配列を持つ浮動小数点数のアレイのアレイ。

この答えは、単一の呼び出しで複数の色で散布コマンドを使用しての2つのオプションがあり、2015年


に自分自身の2013年版を補正するためのOxinaboxの無限の情熱を@に捧げています。

  1. pylab.scatterコマンドサポートRGBA配列を使用して任意の色を指定できます。初期の2013年に

  2. バックは、コマンドは、全体の散布ポイント収集のための単一の色をサポートしているので、そうする方法はありません。私が10000ラインのプロジェクトをやっているとき、私はそれをバイパスするための一般的な解決策を見つけました。それは非常に粘着性であるが、私はどのような形、色、大きさ、透明でそれを行うことができます。このトリックはまた、パスの収集、ラインのコレクションを描画するために適用することができ....

コードは、私はちょうどそれが描画するトリガーせずに何をするか散布複製し、pyplot.scatterのソースコードに触発されています。

コマンドは、ファイル「matplotlibの/ collections.py」Collectionクラスのプライベート変数_facecolors及び方法set_facecolorsで、PatchCollectionオブジェクトを返しますpyplot.scatter。そう

あなたはこれを行うことができます描画する散布点を持つたび:

# rgbaArr is a N*4 array of float numbers you know what I mean 
# X is a N*2 array of coordinates 
# axx is the axes object that current draw, you get it from 
# axx = fig.gca() 

# also import these, to recreate the within env of scatter command 
import matplotlib.markers as mmarkers 
import matplotlib.transforms as mtransforms 
from matplotlib.collections import PatchCollection 
import matplotlib.markers as mmarkers 
import matplotlib.patches as mpatches 


# define this function 
# m is a string of scatter marker, it could be 'o', 's' etc.. 
# s is the size of the point, use 1.0 
# dpi, get it from axx.figure.dpi 
def addPatch_point(m, s, dpi): 
    marker_obj = mmarkers.MarkerStyle(m) 
    path = marker_obj.get_path() 
    trans = mtransforms.Affine2D().scale(np.sqrt(s*5)*dpi/72.0) 
    ptch = mpatches.PathPatch(path, fill = True, transform = trans) 
    return ptch 

patches = [] 
# markerArr is an array of maker string, ['o', 's'. 'o'...] 
# sizeArr is an array of size float, [1.0, 1.0. 0.5...] 

for m, s in zip(markerArr, sizeArr): 
    patches.append(addPatch_point(m, s, axx.figure.dpi)) 

pclt = PatchCollection(
       patches, 
       offsets = zip(X[:,0], X[:,1]), 
       transOffset = axx.transData) 

pclt.set_transform(mtransforms.IdentityTransform()) 
pclt.set_edgecolors('none') # it's up to you 
pclt._facecolors = rgbaArr 

# in the end, when you decide to draw 
axx.add_collection(pclt) 
# and call axx's parent to draw_idle() 
+0

だから私は読むのがちょっと複雑で、2013年にはPythonを1年間使いました。なぜ人々はそれをどうやって行うのか知りたいのですか?それが働いた後、私は再びそれを見て気にしない。私のプロジェクトは、上記のコードで多くの視覚化を描くことでしたが、作業の流れは合理化されました。 – Hualin

6

あなたはいつものようにplot()機能を使用することができます。

import matplotlib.pyplot as plt 

import numpy as np 

x = np.arange(10) 
ys = [i+x+(i*x)**2 for i in range(10)] 
plt.figure() 
for y in ys: 
    plt.plot(x, y, 'o') 
plt.show() 

plot as scatter but changes colors

9

簡単に修正を

また、AFの色を変更することができますあなたがそれらをプロットしていれば、これは時々実行する方が簡単です。

import matplotlib.pyplot as plt 
from random import randint 
import numpy as np 

#Let's generate some random X, Y data X = [ [frst group],[second group] ...] 
X = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)] 
Y = [ [randint(0,50) for i in range(0,5)] for i in range(0,24)] 
labels = range(1,len(X)+1) 

fig = plt.figure() 
ax = fig.add_subplot(111) 
for x,y,lab in zip(X,Y,labels): 
     ax.scatter(x,y,label=lab) 

あなたが必要なコードの唯一の作品:

#Now this is actually the code that you need, an easy fix your colors just cut and paste not you need ax. 
colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired 
colorst = [colormap(i) for i in np.linspace(0, 0.9,len(ax.collections))]  
for t,j1 in enumerate(ax.collections): 
    j1.set_color(colorst[t]) 


ax.legend(fontsize='small') 

出力は、同じサブプロットの多くの異なった散布図を持っている場合でも、あなたにdiffernent色を与えます。

enter image description here

関連する問題