2012-09-02 725 views
95

假設我有三個數據集:設置不同的顏色爲每個系列在散點圖上matplotlib

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套?

我搜索了這個,可以找到我要問的任何參考。

編輯:澄清(希望)我的問題

如果我叫散射多次,我只能爲每個散射相同的顏色。另外,我知道我可以手動設置顏色數組,但我確信有更好的方法來做到這一點。 我的問題是的話,「我怎樣才能自動散點圖我的幾個數據集,每一個不同的顏色。

是否有幫助,我可以輕鬆地分配一個唯一的編號給每個數據集。

+1

這是什麼問題?顏色也可以是一個數組,但是隻要調用多次散佈,你不能解決什麼問題? – seberg

+1

如果我多次調用scatter,我會得到相同的顏色。我會更新我的問題。 – Yotam

回答

150

我。不知道你說「手動」的意思你可以選擇一個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得到你想要的一個。例如(我懶得打出十個顏色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:如果你指定所有十個,不是,但我同意騎自行車排除那裏的目的..:^) – DSM

+0

準確地說,那麼它不是一個週期:) –

27

在matplotlib中用不同顏色的點繪製圖的正常方式是將顏色列表作爲參數傳遞。

例如爲:

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

3 colors

當你有一個列表的列表,你想他們每個列表着色。 我認爲最優雅的方式是由@DSM建議, 只是做一個循環,使多個調用分散。

但是,如果由於某種原因,你想只用一個調用做到這一點,就可以讓顏色的大名單,與列表理解和一點地板師:

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(2013年8月),這是您可以在matpplotlib網站上找到的最老的穩定版本。但之後,這是相當微不足道的。

因爲matplotlib.pylab.scatter的當前版本支持賦值:顏色名稱字符串數組,顏色地圖浮點數數組,RGB或RGBA數組。

這個答案是奉獻給@ Oxinabox的修正2013年版的自己無盡的激情在2015年


你必須使用在單一通話多種顏色散射命令兩個選項。

  1. as pylab.scatter命令支持使用RGBA數組來做任何你想要的顏色;

  2. 早在2013年,無法這樣做,因爲該命令僅支持整個分散點集合中的單色。當我在做10000線項目時,我想出了一個繞過它的通用解決方案。所以它很俗氣,但我可以做任何形狀,顏色,大小和透明度。這一招也可以適用於繪製路徑集合,線集合....

的代碼也由pyplot.scatter源代碼的啓發,我只是重複而不觸發它來繪製做什麼分散。

命令pyplot.scatter返回PatchCollection對象,在文件「matplotlib/collections.py」在Collection類私有變量_facecolors和方法set_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() 
+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') 

的輸出,讓用戶可依使用的顏色,甚至當你在同一個插曲許多不同的散點圖。

enter image description here

相關問題