Форматирование Matplotlib по оси X показывает 1 января 1970

#python-3.x #matplotlib

#python-3.x #matplotlib

Вопрос:

Новичок в Matplotlib, пытаюсь отформатировать даты по оси x. Если я просто использую plt.xticks, дата указана правильно. Но если я попытаюсь отформатировать значения с помощью ax.xaxis.set_major_formatter , это изменит значения моей оси на основе Jan-1-1970. Я уверен, что это материал для новичков, спасибо за загрузку. (Кстати, выполняется в ноутбуке JupyterLabs).

 import pandas as pd
from datetime import date
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline

# data to plot
#df_plot = df_dts[df_dts.dt>"8/17/2020"]
df_plot = pd.DataFrame({
    'dt': [date(2020,8,19), date(2020,8,20), date(2020,8,21), date(2020,8,22)],
    'open_cnt': [2,15,2,7],
    'close_cnt': [0,2,11,0]
})

# create plot
fig, ax = plt.subplots()
fig.set_size_inches(10, 5, forward=True)
index = np.arange(len(df_plot))
bar_width = 0.35
opacity = 0.8

rects1 = plt.bar(index, df_plot.open_cnt, bar_width, alpha=opacity, color='orange', label='Open')
rects2 = plt.bar(index   bar_width, df_plot.close_cnt, bar_width, alpha=opacity, color='g', label='Close')

plt.xlabel('Date')
plt.ylabel('Workitems')
plt.title('Open amp; Close Rates')
plt.xticks(index   bar_width/2, df_plot.dt)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b-%d-%y'))
plt.show()
  

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

Ответ №1:

Вместо того, чтобы возиться с форматером, установите индекс в вашем DataFrame на правильное текстовое представление ваших дат и вызовите plot.bar для этого объекта:

 fig, ax = plt.subplots(figsize=(10,5))
ax = df_plot.set_index(df_plot.dt.map(lambda s: s.strftime('%b-%d-%y')))
    .plot.bar(ax=ax, legend=False, title='Open amp; Close Rates', rot=0,
    color=['orange', 'green'])
ax.set_xlabel('Date')
ax.set_ylabel('Workitems');
  

Для ваших данных я получил следующую картинку:

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

Как вы можете видеть, мой код более лаконичен, чем ваш.

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

1. работает отлично. Не знал, что индекс фрейма данных используется в качестве matplotlib оси. Это потому, что он вызывается из pandas? Есть ли другие преимущества вызова plot из самого фрейма данных? И мне нравится, насколько компактен ваш код, это потрясающе. Спасибо @Valdi_Bo ~

2. В pyplot средство форматирования даты работает совместно с локатором , указывая, для каких значений x (date) печатать метки дат. Итак, вот такой конфликт, что у вас есть значения x в виде целых чисел, а затем вы попытались поместить метки x на основе дат .

3. Однако это не работает для обычных линейных графиков.

Ответ №2:

Если вы не хотите сильно изменять свой исходный код, вы можете просто выполнить преобразование при установке xticks.

 df_plot['dt'] = pd.to_datetime(df_plot['dt'], format='%Y-%m-%d')
plt.xticks(index   bar_width/2, df_plot['dt'].dt.strftime('%b-%d-%y'))