Matplotlib Line против линейчатого графика Форматирование оси DateTime - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть DataFrame с индексом DateTime:

import pandas as pd
from random import randrange
dates = pd.date_range(start="2020-02-01",end='2020-04-18',freq='1d')
df = pd.DataFrame(index=dates,data=[randrange(10000) for i in range(78)]

Теперь, когда я строю данные в виде линейного графика, matplotlib создает хорошо отформатированную ось x:

df.plot(figsize=(12,4))

line plot

Однако, если вместо этого я строю гистограмму, я получаю нечто довольно ужасное:

df.plot(kind='bar',figsize=(12,4)),

bar plot

Это довольно смущает, так как это тот же самый DataFrame. Я хочу иметь гистограмму, но с хорошо отформатированной осью DateTime.

Есть ли простой способ добиться этого? Я попытался использовать команду bar напрямую, но при этом получился еще один формат оси x, не такой хороший, как тот, который был сгенерирован с помощью метода pandas.

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете сделать что-то вроде этого:

In [23]: fig, ax = plt.subplots(figsize=(12, 12))
Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created.

In [27]: ax.bar(df.index.values,
    ...:        df[0],
    ...:        color='purple')
Out[27]: <BarContainer object of 78 artists>

In [29]: import matplotlib.dates as mdates
    ...: from matplotlib.dates import DateFormatter

In [30]: date_form = DateFormatter("%m-%d")
    ...: ax.xaxis.set_major_formatter(date_form)
    ...:
    ...: # Ensure a major tick for each week using (interval=1)
    ...: ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=1))
    ...: plt.show()

enter image description here

...