2013-02-12 358 views
2

以下程序執行得很好,但只顯示一個圖例。我如何顯示所有四個傳說?請看附件中的圖片。matlabplot for循環中的多個圖例

import matplotlib.pyplot as plt 
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]} 

xs = [0,1,2,3,4] 


for i in [1,2,3,4]: 
    plt.plot(xs,dct['list_%s' %i]) 
    plt.legend(['%s data' %i]) 

plt.show() 

enter image description here

+0

只有最後一個傳說會在您運行時顯示? – avasal 2013-02-12 05:47:23

+0

我假設你真的想要一個圖例(即浮動框),其中的所有條目。 – tacaswell 2013-02-12 06:15:12

回答

12
import matplotlib.pyplot as plt 
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2],'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]} 

xs = [0,1,2,3,4] 


for i in [1,2,3,4]: 
    plt.plot(xs,dct['list_%s' %i], label='%s data' % i) 

plt.legend() 

plt.show() 

您針對legend作品,每次調用時都會破壞當前的傳奇人物,用新的替換它的方式跑起來。如果您只給legend一個字符串列表,它將遍歷axes中的藝術家(代表要繪製的數據的對象),直到它用完標籤(因此爲什麼第一條曲線標記爲第四條)。如果在plot命令中包含kwarglabel,那麼當您不帶任何參數調用legend時,它將遍歷藝術家*併爲帶標籤的藝術家生成圖例條目。

[*]也有一些例外哪個藝人會拿起

+0

謝謝你,那非常快! – 2013-02-12 06:20:47

5

據我所知,你需要調用一次的傳說,所有的參數。

import matplotlib.pyplot as plt 
dct = {'list_1' : [1,2,4,3,1],'list_2' : [2,4,5,1,2], 
     'list_3' : [1,1,3,4,6],'list_4' : [1,1,2,2,1]} 

xs = [0,1,2,3,4] 

lines = []  
for i in range(1,5): 
    lines += plt.plot(xs,dct['list_%s' %i], label="{} data".format(i)) 

注意,我這裏包括作爲參數的繪圖功能一個標籤,這樣以後我們可以稱之爲get_label()。

labels = [l.get_label() for l in lines] 
plt.legend(lines, labels) 
plt.show() 

這也將工作,如果你有獨立的軸(如twinx),和所有的圖例信息會通過一個傳奇。順便說一下,我似乎記得%符號是舊的,一個應該更喜歡str.format(),但我恐怕不記得原因。

+0

你不需要用手拉出標籤,它會爲你做到這一點。 '%'符號最終將被從語言中刪除,但它具有巨大的安裝基礎(在標準庫中不少於這個),並且需要很長時間才能清除。 – tacaswell 2013-02-12 05:56:42

+0

的確,你是對的,我只是碰巧這樣,因爲我在那段代碼中有多個軸。請參閱[this](http://stackoverflow.com/questions/5484922/secondary-axis-with-twinx-how-to-add-to-legend?rq=1)問題。感謝提醒我關於%! – 2013-02-12 06:05:33