2013-01-21 76 views
2

我想繪製一些數據,通過測量獲得每個與他們的適合。 我會在每張圖上繪製6個測量圖,但我希望每個測量數據圖都具有與其擬合相同的顏色。從一個測量數據圖到下一個我需要matplotlib的defalut顏色循環。pyplot.plot()修改線條顏色循環

首先,如果加載以下數據:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 
data1 = np.genfromtxt('data1.txt') 
fit1 = np.genfromtxt('fit1.txt') 
... 

那麼問題,我當然可以重新定義顏色順序rcParams,如下所示:

ColourSeq = [] 
ColourSeqOriginal = mpl.rcParams['axes.color_cycle'] 
for ind in range(len(ColourSeqOriginal)): 
    ColourSeq.append(ColourSeqOriginal[ind]) 
    ColourSeq.append(ColourSeqOriginal[ind]) 
mpl.rcParams['axes.color_cycle'] = ColourSeq 

但這種看似複雜。

最簡單的事情似乎是:

plt.figure() 
plt.plot(xdata, data1, xdata, fit1, '???') 
plt.plot(xdata, data2, xdata, fit2, '???') 
plt.plot(xdata, data3, xdata, fit3, '???') 

'???'作爲命令選項,我不知道是否存在會阻止plt.plot遞增給定數據的顏色值的命令選項。 但從一個plt.plot()調用到下一個,我需要有正常的顏色增量。

回答

5

您可以設置顏色週期在每個軸的基礎

ax = plt.gca() 
ax.set_color_cyle(['r','r','b','b',..]) 

一個更清潔的方式做的是這樣的:

import itertools 
colors_ = ['r','b','g','m','k'] # change to what colors you want 

datas = [data1, data2, data3] 
fits = [fit1, fit2, fit3] 
ax = plt.gca() 
for d, f, c in zip(datas, fits, itertools.cycle(colors_)): 
    ax.plot(xdata, d, color=c) 
    ax.plot(xdata, f, color=c) 

這使您能夠控制準確習慣它的顏色,和如果你決定改變你的數據繪圖方式,你只需要改變一次,而不是N次。您還可以輕鬆添加額外的列表(如標籤列表,標記類型,線條樣式等),以控制線條的繪製方式。 (itertools.cycle用於確保顏色永遠不是zip中的限制迭代)。

自動循環有利於原型製作,但您應該養成爲實際繪圖指定顏色的習慣。

+0

有趣的一點是,matplotlib使用itertools.cycle()來遍歷rcParams中的默認顏色。 – Phil

+0

@ user1850133確實,謝謝。你也可以通過界面建議編輯(你得到它的代表)。 – tacaswell

+0

只要我發佈我的評論,我發現你通過添加缺少的'in'來糾正你的帖子,所以我刪除了我的評論。下次我會繼續。 – user1850133

2

plot()沒有任何參數會強制單次調用plot()中的所有行的顏色相同。防止顏色循環增加的唯一方法是使用color='x'指定顏色。

這裏是一個替換的方法,其可以爲你工作:

ax = plt.gca() 
ax.plot(xdata, data1) 
ax.plot(xdata, fit1, color=ax.lines[-1].get_color()) 
ax.plot(xdata, data2) 
ax.plot(xdata, fit2, color=ax.lines[-1].get_color()) 
ax.plot(xdata, data3) 
ax.plot(xdata, fit3, color=ax.lines[-1].get_color()) 

通過指定擬合線的color,顏色週期不遞增上的「匹配」的數據。

+0

你能否讓你的建議更一致?什麼是斧頭? get_color()? – user1850133

+0

我很抱歉,'ax'是你正在繪製的座標軸。 'get_color()'只是返回一行中的顏色屬性。 – Phil

+0

這與我正在尋找的內容非常匹配,儘管我期待着比color = ax.lines [-1] .get_color()更簡單的命令。無論如何,這是matplotlib ......謝謝。 – user1850133