Диаграммы Джанго - ось даты и времени - PullRequest
0 голосов
/ 15 апреля 2011

У меня есть одна модель, которая выглядит так:

class Measurement(models.Model):
    date = models.DateField('date')
    time = models.TimeField('time')
    Q = models.DecimalField(max_digits=10, decimal_places=6)
    P = models.DecimalField(max_digits=10, decimal_places=6)
    f = models.DecimalField(max_digits=10, decimal_places=6)

На мой взгляд, я бы хотел это представить. Итак, я сделал эту функцию:

def plotMeas(request):    

    # Count the events
    c = Measurement.objects.all()
    c = c.count()

    # Variables
    i = 0
    a = [0]
    P = a*c
    Q = a*c
    t = a*c

    # Save dP_L1 & dQ_L1 in lists
    for i in range(c):
        meas = Measurement.objects.get(pk = i+1)
        P [i] = meas.P
        Q [i] = meas.Q
        t [c-1-i] = i*10

    if c > 100:
        P = P[-100:]
        Q = Q[-100:]
        t [i] = t[-100:]

    # Construct the graph
    fig = Figure()
    q = fig.add_subplot(211)

    q.set_xlabel("time (minutes ago)")
    q.set_ylabel("Q (VAR)")

    p = fig.add_subplot(212)

    p.set_xlabel("time (minutes ago)")
    p.set_ylabel("P (W)")

    p.plot(t,P, 'go-')
    q.plot(t,Q, 'o-')

    canvas = FigureCanvas(fig)
    response = HttpResponse(content_type='image/png')

    canvas.print_png(response)
    return response

Однако мне бы хотелось, чтобы на горизонтальной оси отображались дата и время (сохраненные в модели). Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 16 апреля 2011

Ознакомьтесь с документацией для plot_date. Для удобства plot_date принимает аргументы, аналогичные plot. Вызов может выглядеть так:

p.plot_date(sequence_of_datetime_objects, y_axis_values, 'go-') 

Используя matplotlib.dates, вы можете настроить формат ваших меток по оси X.
Простой пример:
Далее будет указано, что ось x отображается только каждый третий месяц в формате Jan '09 (при условии использования англоязычного языка).

p.xaxis.set_major_locator(mdates.MonthLocator(interval=3))
p.xaxis.set_major_formatter(mdates.DateFormatter("%b '%y"))

Поскольку даты и время хранятся отдельно, вы можете захотеть

  1. измените модель на DateTimeField или
  2. используйте Python для combine их.

Например:

import datetime as dt
t1 = dt.time(21,0,1,2) # 21:00:01.2
d1 = dt.date.today()
dt1 = dt.datetime.combine(d1,t1)
# result: datetime.datetime(2011, 4, 15, 21, 0, 1, 2)

Чтобы перебрать две последовательности и объединить их, вы можете использовать zip (код только для иллюстративных целей, не обязательно оптимизированный):

sequence_of_datetime_objects = []
for a_date, a_time in zip(sequence_of_date_objects, sequence_of_time_objects):
    sequence_of_datetime_objects.append(dt.datetime.combine(a_date, a_time))

Не стесняйтесь открывать другой вопрос, если вы застряли в реализации специфики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...