Как построить данные по конкретным датам на оси X с помощью matplotlib - PullRequest
17 голосов
/ 15 августа 2010

У меня есть набор данных, состоящий из пар дата-значение.Я хочу построить их на гистограмме с конкретными датами на оси X.

Моя проблема в том, что matplotlib распределяет xticks по всему диапазону дат;а также наносит на график данные с использованием точек.

Все даты являются datetime объектами.Вот пример набора данных:

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

Вот пример запускаемого кода с использованием pyplot

import datetime as DT
from matplotlib import pyplot as plt

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

x = [date for (date, value) in data]
y = [value for (date, value) in data]

fig = plt.figure()

graph = fig.add_subplot(111)
graph.plot_date(x,y)

plt.show()

РЕЗЮМЕ ВОПРОСА:
Моя ситуацияскорее, у меня есть готовый экземпляр Axes (на который ссылается graph в приведенном выше коде), и я хочу сделать следующее:

  1. Сделать xticks точными значениями даты.Я слышал о matplotlib.dates.DateLocator, но я понятия не имею, как его создать, а затем связать его с конкретным Axes объектом.
  2. Получите более жесткий контроль над типом используемого графика (полоса, линия, точки и т. Д.)

1 Ответ

30 голосов
/ 15 августа 2010

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

Например, на основе приведенного выше примера:

import datetime as DT
from matplotlib import pyplot as plt
from matplotlib.dates import date2num

data = [(DT.datetime.strptime('2010-02-05', "%Y-%m-%d"), 123),
        (DT.datetime.strptime('2010-02-19', "%Y-%m-%d"), 678),
        (DT.datetime.strptime('2010-03-05', "%Y-%m-%d"), 987),
        (DT.datetime.strptime('2010-03-19', "%Y-%m-%d"), 345)]

x = [date2num(date) for (date, value) in data]
y = [value for (date, value) in data]

fig = plt.figure()

graph = fig.add_subplot(111)

# Plot the data as a red line with round markers
graph.plot(x,y,'r-o')

# Set the xtick locations to correspond to just the dates you entered.
graph.set_xticks(x)

# Set the xtick labels to correspond to just the dates you entered.
graph.set_xticklabels(
        [date.strftime("%Y-%m-%d") for (date, value) in data]
        )

plt.show()

Если вы предпочитаете гистограмму, просто используйте plt.bar(). Чтобы понять, как установить стили линии и маркера, см. plt.plot() Участок с метками даты в местах расположения маркеров http://www.geology.wisc.edu/~jkington/matplotlib_date_labels.png

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