2012-10-15 159 views
0

我使用字典來繪製與Python和matplotlib線我無法弄清楚,爲什麼我的線顏色不改變如何改變使用matplotlib和python繪製多線的顏色?

from datetime import datetime 
import matplotlib.pyplot as plt 


dico = {'A01': [(u'11/10/12-08:00:01', 2.0), (u'11/10/12-08:10:00', 10.0), \ 
       (u'11/10/12-08:20:01', 5.0), (u'11/10/12-08:30:01', 15.0), \ 
       (u'11/10/12-08:40:00', 7.0), (u'11/10/12-08:50:01', 45.0)], 
     'A02': [(u'11/10/12-08:00:01', 10.0), (u'11/10/12-08:10:00', 12.0), \ 
       (u'11/10/12-08:20:01', 15.0), (u'11/10/12-08:30:01', 10.0), \ 
       (u'11/10/12-08:40:00', 17.0), (u'11/10/12-08:50:01', 14.0)]} 

x = [] 
y = [] 
lstPlot = [] 
plt.gca().set_color_cycle(["b", "g", "r", "c", "m", "y", "k"]) 
for key, values in dico.iteritems(): 
    for i in sorted(values): 
     # date sting to date obj 
     dateObj = datetime.strptime(i[0], "%d/%m/%y-%H:%M:%S") 
     line = dateObj, i[1] 
     lstPlot.append(line) 
    for i in sorted(lstPlot): 
     x.append(i[0]) 
     y.append(i[1]) 
    plt.plot(x, y, label=key) 



# plotting 

plt.legend(loc='upper right') 
plt.xlabel('Dates') 
plt.ylabel("titre") 
plt.title("Modbus") 
plt.show() 

請注意,我在傳奇,但不是在情節不同的顏色。

回答

3

他們改變,但你是與另一個overplotting之一。這些線

x = [] 
y = [] 
lstPlot = [] 

需要被循環。否則lstPlot只會增長。例如,添加print lstPlot內循環,得到:

[(datetime.datetime(2012, 10, 11, 8, 0, 1), 10.0), (datetime.datetime(2012, 10, 11, 8, 10), 12.0), (datetime.datetime(2012, 10, 11, 8, 20, 1), 15.0), (datetime.datetime(2012, 10, 11, 8, 30, 1), 10.0), (datetime.datetime(2012, 10, 11, 8, 40), 17.0), (datetime.datetime(2012, 10, 11, 8, 50, 1), 14.0)] 
[(datetime.datetime(2012, 10, 11, 8, 0, 1), 10.0), (datetime.datetime(2012, 10, 11, 8, 10), 12.0), (datetime.datetime(2012, 10, 11, 8, 20, 1), 15.0), (datetime.datetime(2012, 10, 11, 8, 30, 1), 10.0), (datetime.datetime(2012, 10, 11, 8, 40), 17.0), (datetime.datetime(2012, 10, 11, 8, 50, 1), 14.0), (datetime.datetime(2012, 10, 11, 8, 0, 1), 2.0), (datetime.datetime(2012, 10, 11, 8, 10), 10.0), (datetime.datetime(2012, 10, 11, 8, 20, 1), 5.0), (datetime.datetime(2012, 10, 11, 8, 30, 1), 15.0), (datetime.datetime(2012, 10, 11, 8, 40), 7.0), (datetime.datetime(2012, 10, 11, 8, 50, 1), 45.0)] 

(您可能會需要滾動過去,就看到第二個名單是很多比第一個長,但你應該注意到,首先看重的是同樣在這兩個)

所以,你可以清除列表裏面,或者你可以把它簡化一下:。

for key, values in dico.iteritems(): 
    points = [(datetime.strptime(i[0], "%d/%m/%y-%H:%M:%S"), i[1]) for i in values] 
    points.sort() 
    x, y = zip(*points) 
    plt.plot(x, y, label=key) 

該代碼,添加@ BMU的的

的建議
plt.gcf().autofmt_xdate() 

自動進行x軸好看,產生

fixed image

[或者,你可能想使用get_xticklabels()和方法,如set_rotation了更好的控制。]

+1

爲了獲得更好的日期格式,你也可以使用'plt.gcf()。autofmt_xdate()' – bmu

+0

@bmu:很好,那*確實使它看起來好多了。我將編輯圖像。 – DSM

1

嘗試:

colors = ["b", "g", "r", "c", "m", "y", "k"] 
for (key, values), c in zip(dico.iteritems(), colors): 
    ... 
    plt.plot(x, y, c, label=key) 
相關問題