Несогласованный масштаб при построении дат

#python-3.x #matplotlib

#python-3.x #matplotlib

Вопрос:

У меня есть список дат, отформатированных с matplotlib.dates.date2num помощью и список целых чисел. Я пытаюсь построить линейный график с датой по оси x. Но matplotlib не всегда правильно отображает даты при использовании Python 3. Однако я заметил, что это не проблема при использовании Python 2.

Это мой код:

 fig, ax = plt.subplots()
plt.title(constants.chart_title)
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis ')
fig.autofmt_xdate()
plt.plot_date(;ist_of_formatted_dates, list_of_integers)
plt.savefig('chart.png')
  

И вот пример того, что выводит один и тот же скрипт, используя 2 разные версии python:

Python 2.7

Python 3.6

При использовании Python 3 кажется, что matplotlib отображает все нечетные дни, и проблема в том, что в марте 31 день, поэтому 03-31 и 04-01 разделены на 1 день, хотя все остальные нечетные дни разделены на 2 дня.

Есть ли какой-либо обходной путь для этого?

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

1. Это было преднамеренное изменение в версии 3.0. Однако, как вы заметили, используемые интервалы неоптимальны, что будет исправлено в 3.1. Пожалуйста, смотрите: matplotlib.org/api/… Чтобы исправить: locator = mdates.AutoDateLocator(interval_multiples=False, ) ax.yaxis.set_major_locator(locator)

2. @JodyKlymak Интервал фиксирован, но я не могу понять, как правильно настроить даты в формате диаграммы. locator = mpd.AutoDateLocator(interval_multiples=False) и ax.xaxis.set_major_locator(locator) делает так, чтобы каждая галочка на оси x указывала 2019 год. Я пытался formatter = mpd.AutoDateFormatter(locator) и formatter.scaled[1/(24.*60.)] = '%D' , но это, похоже, не имеет никакого эффекта. Я был бы признателен, если бы вы могли направить меня в правильном направлении

3. Вам нужно установить форматирование оси. Смотрите Пример, на который я ссылался.

Ответ №1:

Благодаря Джоди Клим я смог решить эту проблему. Я добавил несколько строк кода перед сохранением диаграммы:

 plt.xticks()
locator = mpd.AutoDateLocator(interval_multiples=False)
ax.xaxis.set_major_locator(locator)
  

matplotlib изменены некоторые kwargs по умолчанию для Python 3, поэтому последние 2 строки кода просто возвращают его к старому поведению. И plt.xticks() гарантирует, что даты отформатированы правильно.