Как установить даты по оси x с неравномерным интервалом?

#python #matplotlib

#python #matplotlib

Вопрос:

Я хотел бы нарисовать график времени с помощью matplotlib.dates модуля. Из учебника я знаю, как установить регулярную интервальную дату следующим образом:

 ax.xaxis.set_major_locator(DayLocator())
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
ax.xaxis.set_minor_...
  

Однако в моих данных отсутствует несколько месяцев. Моя дата xaxis больше похожа на: январь, февраль, май, июль, сентябрь, октябрь, сентябрь… шаблон не формируется…

Как я могу справиться с такой ситуацией ?.

Комментарии:

1. Вы хотите создать точечную диаграмму, по оси x которой месяц, а по оси y — значения?

2. ДА… Но график, скорее всего, линейный…

3. тогда как у вас данные для оси x? разве вы не можете просто создать массив для времени, массив для значения и тому подобное plot(times, values) ? извините, если нет, я не понимаю вашу точку зрения…

4. Да, это тоже хорошее решение… Но как я могу установить ось x в формат даты? Я имею в виду, я хочу, чтобы ось x выглядела как 2009-08, 2010-10 подобные вещи. Заранее спасибо.

5. Я использую ticker, чтобы вручную установить xaxis.setMajorFormatter(FixedFormatter(dateStr)) в формат даты, который я хочу. И я использую xaxis.set_major_locator(IndexLocator(1, 0)) для установки местоположения строки даты… Однако есть ли у вас более достойный способ сделать то же самое?

Ответ №1:

Если я правильно понимаю, вам может потребоваться использовать

 matplotlib.ticker.FixedLocator
  

Пример, который помещает метки в точки данных 1, 10 и последнюю:

 import pylab as plt
from matplotlib.ticker import FixedLocator
from matplotlib.dates import DateFormatter
import numpy as np
from datetime import datetime

# dates (unequally spaced, but works exactly same for equally spaced dates too)
dates = plt.date2num(datetime(2010,3,1))    np.array([0, 10, 50, 100, 180, 300])
# just some data
data = dates**2
plt.plot_date(dates,data)

ax = plt.gca()
ax.xaxis.set_major_locator(FixedLocator(dates[[1, 3, len(dates)-1]]))
# for some reason this is needed to get the month displayed too
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
plt.show()
  

Комментарии:

1. Это меняет формат метки. Единственное, что мне было нужно, это from matplotlib.dates import DateFormatter

2. Хм, вопрос Аннеса немного неясен. Но простое использование plot_date приведет к размещению равномерно расположенных тиков и меток на графике даже для неравномерно разнесенных данных. Итак, я понял, что вопрос был «Как установить метки дат по оси x с неравномерным интервалом», на который даны ответы выше.

3. @yosukesabai Ну, как указано в комментарии выше, я не думаю DateFormatter , что это действительно необходимо, поэтому я удалил его из кода.

Ответ №2:

Начиная с решения Мауро, я попытался построить пару данных, где даты расположены неравномерно, чтобы я мог найти этот QA когда-нибудь в будущем.

 import pylab as plt
from matplotlib.ticker import FixedLocator
from matplotlib.dates import DateFormatter
import numpy as np
from datetime import datetime

# dates, irregularly spaced
y = 2010, 2010, 2010, 2011, 2011
m =    9,   11,   12,    3,    4


dates = np.array([plt.date2num(datetime(yy,mm,1)) for yy,mm in zip(y,m)])
print dates


# just some data
data = dates**2
print data


plt.plot_date(dates,data)

ax = plt.gca()
# need some more thnking for properly locate which date to label
#ax.xaxis.set_major_locator(FixedLocator(dates[[1, 10, len(dates)-1]]))
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
plt.show()
  

введите описание изображения здесь