2015-09-02 49 views
2

有沒有什麼辦法讓我在一個matplotlib PathPatch上有多種顏色?我有以下代碼,例如,我想給每個「段」自己的顏色(即從0,0到0,1的段可以是紅色,從0,1到2,2可以是橙色,從4,3至5,3可以是黃色的)。我想做到這一點,而不使用集合,只是使用PathPatch多種顏色的一個PathPatch

import matplotlib as mpl 
import matplotlib.pyplot as plt 

fig2, ax2 = plt.subplots() 


verts = [(0,0), (0,1), (2,2), (4,3), (5,3)] 
codes = [1,2,2,1,2] 

pat = mpl.patches.PathPatch(mpl.patches.Path(verts, codes), fill=False, linewidth=2, edgecolor="red") 
ax2.add_patch(pat) 
ax2.set_xlim(-2, 6) 
ax2.set_ylim(-2, 6) 
+0

如果您只有strait部分,'LineCollection'也可能有幫助。 – tacaswell

回答

4

我還沒有發現分配一個單獨的顏色爲mpl.patches.Path的段的方式 - 從the documentation,這並不似乎是可能(Path不採取與它的顏色/線寬任何參數的/ etc。)


但是 - 正如你在你的問題狀態 - 可以使用a PathCollection不同顏色個別PathPatches結合起來。
重要的論據是match_original=True
對於其他類似的情況,這裏有一個例子:

import matplotlib as mpl 
import matplotlib.pyplot as plt 

fig2, ax2 = plt.subplots() 


verts = [(0,0), (0,1), (2,2), (4,3), (5,3)] 
codes = [[1,2],[1,2],[1,1],[1,2],[1,2]] 

colors = ['red', 'orange', 'black', 'yellow'] 

pat = [mpl.patches.PathPatch(mpl.patches.Path(verts[i:i+2], codes[i]), fill=False, \ 
         linewidth=2, edgecolor=colors[i]) for i in range(len(verts)-1)] 

collection = mpl.collections.PatchCollection(pat, match_original=True) 
ax2.add_collection(collection) 

ax2.set_xlim(-2, 6) 
ax2.set_ylim(-2, 6) 

plt.show() 

注意事項:

  • codes現在變成了一個列表的列表,以確定每個部分單獨
  • colors是一個列表帶有顏色標識符的字符串。如果你想利用顏色表,看看this answer
  • 個別修補軟件都存儲在一個列表,pat,該循環代替完成
  • 所有pat補丁使用collections.PatchCollection組裝 - 在這裏,的重要參數是match_original=True,否則所有線路將是默認黑具有默認線寬

上面的例子產生這樣的輸出:

example