Редактировать: , если вы все еще используете matplotlib 2.2.x , вы можете использовать тикер matplotlib api:
import matplotlib.ticker as ticker
#generate some random data
idx= pd.date_range(start='2016-01-01', end='2020-02-01',freq='m')
df=pd.DataFrame({'rand1':np.random.random(len(idx)),
'rand2': np.random.random(len(idx)),
'rand3': np.random.random(len(idx))},index=idx)
#stack plot
fig, axs = plt.subplots(figsize=(20,18),constrained_layout=True)
axs.stackplot(df.index,df.rand1,df.rand2,df.rand3)
#Adjust ticks
axs.set_xticks(pd.to_datetime(idx.year.unique().astype(str)), minor=False)
axs.xaxis.set_major_formatter(ticker.FixedFormatter(idx.year.unique().astype(str)))
#create bimonthly minor ticks
months=pd.date_range(start=idx[0], end=idx[-1],freq='2M')
axs.set_xticks(pd.to_datetime(months), minor=True)
axs.xaxis.set_minor_formatter(ticker.FixedFormatter(months.month.astype(str)))
#adjust major ticks aesthetics
axs.tick_params(axis='x',which='major',length=5,width=1.5, pad=4, labelsize=14)
ЕслиВы хотите отображать меньше / больше месяцев, вы можете просто настроить частоту в pd.date_range(start=idx[0], end=idx[-1],freq='2M')
.
Это результат:
Для matplotlib3.1.x:
Возможно, я бы использовал matplotlib автоматический указатель даты вместе с кратким форматером даты :
#generate some random data
idx= pd.date_range(start='2016-01-01', end='2020-01-01',freq='m')
df=pd.DataFrame({'rand1':np.random.random(len(idx)),
'rand2': np.random.random(len(idx)),
'rand3': np.random.random(len(idx))},index=idx)
#stack plot
fig, axs = plt.subplots(figsize=(20,18),constrained_layout=True)
axs.stackplot(df.index,df.rand1,df.rand2,df.rand3)
locator = mdates.AutoDateLocator(minticks=15, maxticks=20)
formatter = mdates.ConciseDateFormatter(locator)
axs.xaxis.set_major_locator(locator)
axs.xaxis.set_major_formatter(formatter)
Изменяя аргумент автодателокатора, вы можете настроить частоту ваших тиков. Здесь вы также можете найти несколько примеров того, как изменить вывод краткого форматера даты.
ps Я использовал функцию стека графиков matplotlib, но вы должны быть в состоянии получитьаналогичный результат также с использованием функции pandas plot.area.
pps на вашем примере я не смог воспроизвести вашу проблему, поскольку диапазон дат слишком короткий, а автоматический форматер из pandas просто работалхорошо.
это результат, который я получил: