сюжет время дня против даты в matplotlib - PullRequest
6 голосов
/ 25 января 2011

Я хочу нанести на график определенным образом даты на оси x и время дня на оси y, а затем иметь либо линейные, либо интервальные (плавающая полоса) графики.

Этот ответ SO помогает

Но у меня есть несколько отличий от этого сюжета, и я не могу заставить его работать. Я на самом деле получаю ось Y, чтобы отобразить как ДАТЫ, так и время, поэтому она сокращает месячные метки времени по оси Y, когда мне просто нужно около одного дня. В этом примере в комментариях утверждается, что «базовая дата для yaxis может быть любой, поскольку информация находится во времени», но я не понимаю, как он «выбрасывает» информацию о базовой дате.

В любом случае, мои потребности:

  1. Я бы хотел использовать опцию 24 часа (с 00:00 до 24:00) или в стиле am / pm для оси y, при этом отметки на осях выглядят как 3:00 pm, 11:00 am. Я думаю, это будет сделано с помощью FuncFormatter.

  2. Для интервалов (диапазонов времени) я не хочу использовать полосы ошибок - линии слишком тонкие. Я хотел бы использовать (плавающий) график столбца / столбца.

Мои данные представляют собой строки даты и времени в формате '2010-12-20 05: 00: 00'

Спасибо за любую помощь.

Ответы [ 2 ]

10 голосов
/ 25 января 2011

Я думаю, вы немного озадачены тем, как именно matplotlib обрабатывает время и даты за кулисами.

Все даты в matplotlib представлены в виде простых чисел с плавающей точкой. 1 день соответствует разнице 1,0, а даты указаны с 1900 года (если я правильно помню, в любом случае).

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

Я собираюсь использовать очки, но вы можете легко использовать бары. Посмотрите на использование ключевого аргумента bottom, если вы используете plt.bar, чтобы нижняя часть баров начиналась во время начала ваших интервалов (и помните, что вторым аргументом является height из бар, а не его верхнее значение y).

Например:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime as dt

# Make a series of events 1 day apart
x = mpl.dates.drange(dt.datetime(2009,10,1), 
                     dt.datetime(2010,1,15), 
                     dt.timedelta(days=1))
# Vary the datetimes so that they occur at random times
# Remember, 1.0 is equivalent to 1 day in this case...
x += np.random.random(x.size)

# We can extract the time by using a modulo 1, and adding an arbitrary base date
times = x % 1 + int(x[0]) # (The int is so the y-axis starts at midnight...)

# I'm just plotting points here, but you could just as easily use a bar.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot_date(x, times, 'ro')
ax.yaxis_date()
fig.autofmt_xdate()

plt.show()

Time vs. Date

Надеюсь, это немного поможет!

2 голосов
/ 25 января 2011

Следуйте ответу Джо Кингстона, но я бы добавил, что вам нужно преобразовать строки даты в объекты datetime, что легко сделать с помощью модуля datetime, а затем преобразовать их в даты matplotlib, представленные как числа с плавающей запятой (которые затем могут бытьформатируется по желанию).

import datetime as dt
import matplotlib as mpl

some_time_str = '2010-12-20 05:00:00'
some_time_dt = dt.datetime.strptime(some_time_str, '%Y-%m-%d %H:%M:%S')
some_time_num = mpl.dates.date2num(some_time_dt) # 734126.20833333337

Если вы начинаете с массива, заполненного временными строками, вы можете сделать что-то вроде:

time_str_list = ['2010-12-20 05:00:00','2010-12-20 05:30:00']
time_num_list = map(
    lambda x: mpl.dates.date2num(dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')),
    time_str_list) #[734126.20833333337, 734126.22916666663]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...