0

Python と matplotlib で線をプロットするために辞書を使用しています。線の色が変化しない理由がわかりません。

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()

凡例には異なる色がありますが、プロットにはありません。

4

2 に答える 2

3

それら変化していますが、一方を他方と重ね合わせています。これらの行

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)]

(おそらくスクロールして、2 番目のリストが最初のリストよりも長いことを確認する必要がありますが、最初の値は両方で同じであることに注意してください。)

したがって、内部のリストをクリアするか、少し単純化することができます。

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 軸を自動的に見栄えよくするために、

固定画像

[または、より細かく制御するためget_xticklabels()に や のようなメソッドを使用することもできますset_rotation。]

于 2012-10-15T16:15:37.417 に答える
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)
于 2012-10-15T16:16:12.497 に答える