Построение данных временных рядов с использованием matplotlib и отображение года только в начале года

rcParams['date.autoformatter.month'] = "%b\n%Y"

Я использую matpltolib для построения временных рядов, и если я установлю rcParams, как указано выше, полученный график будет иметь имя месяца и год, отмеченные на каждом тике. Как я могу настроить его так, чтобы год отображался только в январе каждого года. Я пытался сделать это, но это не работает:

rcParams['date.autoformatter.month'] = "%b"
rcParams['date.autoformatter.year'] = "%Y"

person user308827    schedule 09.04.2018    source источник
comment
Какова длина вашего временного ряда? Если у вас есть метки x, вы можете попробовать найти и заменить так, чтобы каждый январь включал год.   -  person BenT    schedule 09.04.2018
comment
временной ряд может охватывать до 2 лет. Однако такой подход звучит хакерски   -  person user308827    schedule 09.04.2018
comment
Я не верю, что вы сможете получить то, что хотите, без хакерского подхода.   -  person BenT    schedule 09.04.2018


Ответы (1)


Форматеры не позволяют указывать на них условия. В зависимости от диапазона серии AutoDateFormatter попадет либо в диапазон date.autoformatter.month, либо в диапазон date.autoformatter.year.

Кроме того, AutoDateLocator может вообще не решить отметить первое января.

Поэтому я бы предложил указать тикеры непосредственно в желаемом формате и в нужном месте. Вы можете использовать большие галочки, чтобы показать годы, и второстепенные галочки, чтобы показать месяцы. Затем формат для основных меток может получить разрыв строки, чтобы не перекрываться с второстепенными метками.

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

t = [datetime(2016,1,1), datetime(2017,12,31)]
x = [0,1]

fig, ax = plt.subplots()
ax.plot(t,x)

ax.xaxis.set_major_locator(matplotlib.dates.YearLocator())
ax.xaxis.set_minor_locator(matplotlib.dates.MonthLocator((1,4,7,10)))

ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter("\n%Y"))
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter("%b"))
plt.setp(ax.get_xticklabels(), rotation=0, ha="center")

plt.show()

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

Затем вы также можете адаптировать длины второстепенных тиков, чтобы они соответствовали длинам основных, если это необходимо,

ax.tick_params(axis="x", which="both", length=4)
person ImportanceOfBeingErnest    schedule 09.04.2018