Вот исправления для ваших опций:
- Вариант 1 (с
strftime
): вы можете использовать set_xticks
, чтобы также обеспечить правильные позиции тиков. - Опция 2 (с
mdates
): вы должны a) указать a MonthLocator
и b) вам нужно преобразовать ваш индекс, чтобы они были datetime.date
, а не datetime.datetime
. Это досадная проблема , о которой более подробно писал . Это не проблема, если вы строите все из matplotlib
, но делаете это через pandas
, по-видимому, так и есть.
Вот полный код и результат, с графиком 1 с использованием опции 1 и график 2 с использованием варианта 2. Между этими двумя вариантами все еще есть небольшие различия, которые можно отформатировать (как ни странно, галочки в варианте 2 отображаются вертикально, а вариант 1 - нет):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, MonthLocator
from datetime import datetime
# create an array of 5 dates starting at '2020-02-24', one every month
rng = pd.date_range('2020-02-24', periods=5, freq='MS')
df_1 = pd.DataFrame({ 'Date': rng, 'Val' : np.random.randn(len(rng))})
df_1.set_index("Date", inplace = True)
df_2 = pd.DataFrame({ 'Date': rng, 'Val' : np.random.randn(len(rng))})
df_2.set_index("Date", inplace = True)
print(df_1, "\n")
print(df_2)
#Set up figure
fig, ax = plt.subplots(1,2, figsize=(11,5))
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=None) #Adjust space between graphs
#Plot 1
df_1.plot(ax=ax[0], kind="line", color="forestgreen", stacked=False, rot=90)
ax[0].set_axisbelow(True) # To put plot grid below plots
ax[0].yaxis.grid(color='gray', linestyle='dashed')
ax[0].xaxis.grid(color='gray', linestyle='dashed')
# option 1
ax[0].set_xticks([pandas_datetime.strftime("%d %b %Y") for pandas_datetime in df_1.index])
ax[0].set_xticklabels([pandas_datetime.strftime("%d %b %Y") for pandas_datetime in df_1.index])
ax[0].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.) # Put legend on top
ax[0].set(xlabel=None, ylabel="Amount %") # Set axis label
#Plot
#SEE THIS NEW LINE!!!
df_2.index = [pd.to_datetime(date).date() for date in df_2.index]
df_2.plot(ax=ax[1], kind='line', stacked=False, color="violet", rot=90)
ax[1].set_axisbelow(True) # To put plot grid below plots
ax[1].yaxis.grid(color='gray', linestyle='dashed')
ax[1].xaxis.grid(color='gray', linestyle='dashed')
# option 2
#see new line before df_2.plot
ax[1].xaxis.set_major_locator(MonthLocator())
ax[1].xaxis.set_major_formatter(DateFormatter('%d %b %Y'))
plt.xticks(rotation=0, fontsize=8)
ax[1].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.) # Put legend on top
ax[1].set(xlabel=None, ylabel="Amount %") # Set axis label
введите описание изображения здесь