2013-08-08 4 views
1

Я пытаюсь построить график с датами в виде оси x. Это хорошо, но метки не совпадают с точками данных.Matplotlib выравнивание меток оси x

from datetime import datetime 
import pylab as p 
from matplotlib.dates import date2num, num2date 

scores = [ 
     (datetime.strptime("2013-08-07T14:00", "%Y-%m-%dT%H:%M"), 1280), 
     (datetime.strptime("2013-08-07T15:00", "%Y-%m-%dT%H:%M"), 1272), 
     (datetime.strptime("2013-08-07T16:00", "%Y-%m-%dT%H:%M"), 1252), 
     (datetime.strptime("2013-08-07T17:00", "%Y-%m-%dT%H:%M"), 1293), 
     (datetime.strptime("2013-08-07T18:00", "%Y-%m-%dT%H:%M"), 1258), 
     (datetime.strptime("2013-08-07T19:00", "%Y-%m-%dT%H:%M"), 1240), 
     (datetime.strptime("2013-08-07T20:00", "%Y-%m-%dT%H:%M"), 1287), 
     (datetime.strptime("2013-08-07T21:00", "%Y-%m-%dT%H:%M"), 1241), 
     (datetime.strptime("2013-08-07T22:00", "%Y-%m-%dT%H:%M"), 1286), 
     (datetime.strptime("2013-08-07T23:00", "%Y-%m-%dT%H:%M"), 1237), 
     (datetime.strptime("2013-08-08T00:00", "%Y-%m-%dT%H:%M"), 1269), 
     (datetime.strptime("2013-08-08T01:00", "%Y-%m-%dT%H:%M"), 1269), 
     (datetime.strptime("2013-08-08T02:00", "%Y-%m-%dT%H:%M"), 1258), 
     (datetime.strptime("2013-08-08T03:00", "%Y-%m-%dT%H:%M"), 1259), 
     (datetime.strptime("2013-08-08T04:00", "%Y-%m-%dT%H:%M"), 1265), 
     (datetime.strptime("2013-08-08T05:00", "%Y-%m-%dT%H:%M"), 1225), 
     (datetime.strptime("2013-08-08T06:00", "%Y-%m-%dT%H:%M"), 1251), 
     (datetime.strptime("2013-08-08T07:00", "%Y-%m-%dT%H:%M"), 1297), 
     (datetime.strptime("2013-08-08T08:00", "%Y-%m-%dT%H:%M"), 1244), 
     (datetime.strptime("2013-08-08T09:00", "%Y-%m-%dT%H:%M"), 1283), 
     (datetime.strptime("2013-08-08T10:00", "%Y-%m-%dT%H:%M"), 1253), 
     (datetime.strptime("2013-08-08T11:00", "%Y-%m-%dT%H:%M"), 1305), 
     (datetime.strptime("2013-08-08T12:00", "%Y-%m-%dT%H:%M"), 1284), 
     (datetime.strptime("2013-08-08T13:00", "%Y-%m-%dT%H:%M"), 1318), 
     (datetime.strptime("2013-08-08T14:00", "%Y-%m-%dT%H:%M"), 454), 
    ] 

if __name__ == "__main__": 
    fig = p.figure() 
    ax = fig.add_subplot(1,1,1) 
    x = [date2num(date) for (date, value) in scores] 
    y = [value for (date, value) in scores] 
    ax.plot(x, y, 'r-x') 
    ticks = [num2date(t) for t in x[0::4]] 
    ax.set_xticklabels([t.strftime("%H:%M") for t in ticks], rotation="45") 
    p.savefig("line_plot.png") 

В результате получается следующий график.

Sample output

Первая точка данных должна начаться в 14:00, и это, кажется, 3 часа из. Расстояние между точками данных выглядит правильно, просто смещение начала отключено. Любые идеи, почему это делается?

Update: Основываясь на комментарий, который, как представляется, были удалены, я имел взгляд на метод plot_date, который мне удалось хоть как-то пропустить ... Я теперь изменил код к следующему. Это дает мне хороший график, где тики находятся в нужном месте.

if __name__ == "__main__": 
    fig = p.figure() 
    ax = fig.add_subplot(1,1,1) 
    x = [date2num(date) for (date, value) in scores] 
    y = [value for (date, value) in scores] 
    ax.plot_date(x, y, 'r-x') 
    fig.autofmt_xdate() 
    p.savefig("line_plot.png") 
+1

потому что вы просто сдуваете метки осей и заменяете их текстом независимо от того, где они должны быть. – tacaswell

+0

http://matplotlib.org/api/axis_api.html#matplotlib.axis.Axis.set_ticklabels – tacaswell

ответ

1

Вы преобразование данных х в серию поплавков, которые понятная datetime модуля питона, но при переходе их в p.plot(x, y) он просто видит кучу поплавков. Затем вы по существу устанавливаете метки произвольно.

Вы должны использовать ax.plot_date(x, y, 'r-x'), который принимает x в качестве даты или поплавкового представления. Для этого вам нужно удалить ручную настройку ярлыков x. Затем см. Документы о том, как затем настроить формат оси x.

+0

Спасибо, это было предложение, сделанное в комментарии, которое кто-то опубликовал, но затем удалил. – CadentOrange

+0

@CadentOrange Извините, я не видел этот комментарий. – Greg

+0

Не извиняйтесь. Человек, который его удалил по какой-то причине. Ваш ответ уточняет это. – CadentOrange

Смежные вопросы