204

3つのデータセットがあるとします。

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

私はこれを散布図にすることができます:

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

10セットでこれを行うにはどうすればよいですか?

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

編集:(うまくいけば)私の質問を明確にする

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

それが役立つ場合は、各データセットに一意の番号を簡単に割り当てることができます。

4

8 に答える 8

325

「手動」とはどういう意味かわかりません。カラーマップを選択して、カラー配列を簡単に作成できます。

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)

異なる色のMatplotlibグラフ

itertools.cycleまたは、ループする色を使用して指定し、を使用して独自のカラーサイクラーを作成し、必要な色nextを取得することもできます。たとえば、3色の場合:

import itertools

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

3色のみのMatplotlibグラフ

考えてみるzipと、最初のものと一緒に使用しない方がクリーンかもしれません。

colors = iter(cm.rainbow(np.linspace(0, 1, len(ys))))
for y in ys:
    plt.scatter(x, y, color=next(colors))
于 2012-09-02T14:39:07.303 に答える
63

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

例えば:

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

3色

リストのリストがあり、リストごとに色を付けたい場合。最もエレガントな方法は、@ DSMによって提案された方法であり、スキャッターを複数回呼び出すループを実行するだけだと思います。

しかし、何らかの理由で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)

すべてプロット

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])]
于 2015-09-18T10:27:53.097 に答える
24

簡単な修正

コレクションのタイプが1つしかない場合(たとえば、エラーバーのない散布図)、プロットした後で色を変更することもできます。これは、実行が簡単な場合があります。

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

同じサブプロットに多くの異なる散布図がある場合でも、出力は異なる色を提供します。

ここに画像の説明を入力してください

于 2016-08-26T14:07:19.523 に答える
10

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

散乱としてプロットしますが、色を変更します

于 2016-03-03T08:11:10.127 に答える
6

この質問は、2013年1月およびmatplotlib 1.3.1(2013年8月)より前は少し注意が必要です。これは、matpplotlibWebサイトで見つけることができる最も古い安定バージョンです。しかし、その後は非常に些細なことです。

現在のバージョンのmatplotlib.pylab.scatterサポート割り当て:色名文字列の配列、カラーマップ付きの浮動小数点数の配列、RGBまたはRGBAの配列。

この答えは、2015年に自分の2013年版を修正するという@Oxinaboxの果てしない情熱に捧げられています。


1回の呼び出しで複数の色でスキャッターコマンドを使用する2つのオプションがあります。

  1. コマンドサポートとして、pylab.scatterRGBA配列を使用して任意の色を実行します。

  2. 2013年の初めには、コマンドは散布点コレクション全体に対して単一の色しかサポートしていないため、これを行う方法はありません。10000行のプロジェクトを行っていたとき、それを回避するための一般的な解決策を見つけました。とても粘着性がありますが、どんな形、色、サイズ、透明でもできます。このトリックは、描画パスコレクション、線コレクションにも適用できます。

コードものソースコードに触発されていますpyplot.scatter。私は、スキャッターが描画をトリガーせずに行うことを複製しました。

このコマンドは、ファイル「matplotlib / collections.py」で、クラスとメソッドのプライベート変数でpyplot.scatterあるオブジェクトを返します。PatchCollection_facecolorsCollectionset_facecolors

したがって、描画する散布点がある場合はいつでも、これを行うことができます。

# 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()
于 2015-09-18T12:26:25.037 に答える
1

これは私のために働きます:

シリーズごとに、ランダムなrgbカラージェネレーターを使用します

c = color[np.random.random_sample(), np.random.random_sample(), np.random.random_sample()]
于 2018-08-07T04:33:16.407 に答える
1

大規模なデータセットと限られた数の色に対するはるかに高速なソリューションは、Pandasとgroupby関数を使用することです。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time


# a generic set of data with associated colors
nsamples=1000
x=np.random.uniform(0,10,nsamples)
y=np.random.uniform(0,10,nsamples)
colors={0:'r',1:'g',2:'b',3:'k'}
c=[colors[i] for i in np.round(np.random.uniform(0,3,nsamples),0)]

plt.close('all')

# "Fast" Scatter plotting
starttime=time.time()
# 1) make a dataframe
df=pd.DataFrame()
df['x']=x
df['y']=y
df['c']=c
plt.figure()
# 2) group the dataframe by color and loop
for g,b in df.groupby(by='c'):
    plt.scatter(b['x'],b['y'],color=g)
print('Fast execution time:', time.time()-starttime)

# "Slow" Scatter plotting
starttime=time.time()
plt.figure()
# 2) group the dataframe by color and loop
for i in range(len(x)):
    plt.scatter(x[i],y[i],color=c[i])
print('Slow execution time:', time.time()-starttime)

plt.show()
于 2020-03-07T16:58:28.157 に答える
-1

散布図に必要なすべての色を含む色のリストを作成し、次のように内部のパラメーターとして指定することもできます。

colors = ["red", "blue", "green"]
plt.scatter(X, Y, color = colors)
于 2021-05-30T16:39:15.320 に答える