Pandas Plotting Отображение всех значений даты на оси x (matplolib отображает только несколько значений) в формате MMM-YYYY [дубликат]

Dec 17 2020
import os
import pandas as pd
import matplotlib.pyplot as plt
import datetime

df = pd.read_excel(DATA_DIR+"/"+file_list[0], index_col="Date")
df.head(5)

smooth = df['Pur. Rate'].rolling(window=20).mean()
smooth.plot()

Я получаю следующий график, и мне нужно отобразить все значения даты для каждого МЕСЯЦА-ГОДА на оси x. Я хочу отобразить все месяцы и годы, отформатированные по диагонали по оси x в формате (19 февраля). Я могу увеличить размер участка, чтобы уместить все, так как сохраню его как jpg.

Я хочу, чтобы ось x имела следующие значения: 16 января, 16 февраля, 16 марта, 16 апреля, 16 мая, 16 июня, 16 июля, 16 августа, 16 сентября, 16 октября, 16 ноября, 16 декабря, 17 января. , 17 февраля… (я хочу отобразить все эти значения, matplotlib автоматически обрезает их, я хочу этого избежать)

Ответы

1 Mr.T Dec 17 2020 at 22:48

Как упоминалось в комментариях, вы должны установить и локатор, и форматировщик. Это хорошо объясняется в документации matplotlib для графиков в целом и отдельно для осей даты и времени . См. Также объяснение TickLocators . Коды форматирования получены из кодов формата Python strftime () и strptime () .

from matplotlib import pyplot as plt
import pandas as pd
from matplotlib.dates import MonthLocator, DateFormatter


#fake data
import numpy as np
np.random.seed(123)
n = 100
df = pd.DataFrame({"Dates": pd.date_range("20180101", periods=n, freq="10d"), "A": np.random.randint(0, 100, size=n), "B": np.random.randint(0, 100, size=n),})
df.set_index("Dates", inplace=True)
print(df)

ax = df.plot()

#defines the tick location 
ax.xaxis.set_major_locator(MonthLocator())
#defines the label format
ax.xaxis.set_major_formatter(DateFormatter("%b-%y"))
ax.tick_params(axis="x", labelrotation= 90)

plt.tight_layout()
plt.show()

Пример вывода:

Boul Dec 17 2020 at 20:47

С помощью только функций pandas вы можете использовать stftime () для замены индекса схемы дат «% Y-% m-% d» новой формой «% b-% Y» и некоторыми параметрами в графике .

smoothdf.plot(xticks=smoothdf.index.strftime('%m-%Y').unique()).set_xticklabels(smoothdf.index.strftime('%b-%Y').unique())

xticks, чтобы указать, какой ярлык вы хотите видеть.

set_xticklabels, чтобы изменить список меток.

LucaAngioloni Dec 17 2020 at 20:14

Я предлагаю вам использовать matplotlib, а не pandas plot, и сделать что-то вроде этого, чтобы построить даты в указанном вами формате:

import matplotlib.dates as mdates

from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

myFmt = mdates.DateFormatter('%b-%Y') # date formatter for matplotlib
                                      # %b is Month abbreviated name, %Y is the Year

# ... after some code

fig, ax = plt.subplots(figsize=(15,8))

ax.xaxis.set_major_formatter(myFmt)
fig.autofmt_xdate()

# Plot data ...

ax.set_xticks("""... define how often to show the date""")

Вы можете получить данные из фрейма данных с помощью чего-то вроде: .to_numpy()или .values().

Обратитесь к этой документации для получения информации о set_xticksфункции.