Plotagem de Pandas Exibe todos os valores de data no eixo x (matplolib exibe apenas alguns valores) formatado como MMM-AAAA [duplicado]

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()

Recebo o gráfico a seguir e preciso plotar todos os valores de data para cada MÊS-ANO ​​no eixo x. Desejo exibir todos os meses e anos formatados diagonalmente no eixo x no formato (19 de fevereiro). Posso aumentar o tamanho do gráfico para caber todos, pois vou salvá-lo como jpg.

Desejo que o eixo x tenha os seguintes valores: 16 de janeiro, 16 de fevereiro, 16 de março, 16 de abril, 16 de maio, 16 de junho, 16 de julho, 16 de agosto, 16 de setembro, 16 de outubro, 16 de novembro, 16 de dezembro, 17 de janeiro , 17 de fevereiro… (Quero exibir todos esses valores, matplotlib trunca isso automaticamente, quero evitar isso)

Respostas

1 Mr.T Dec 17 2020 at 22:48

Conforme mencionado nos comentários, você deve definir o Localizador e o Formatador. Isso é bem explicado na documentação do matplotlib para gráficos em geral e separadamente para eixos de data e hora . Veja também uma explicação dos TickLocators . Os códigos de formatação são derivados dos códigos de formato strftime () e strptime () do Python .

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()

Saída de amostra:

Boul Dec 17 2020 at 20:47

Com apenas as funções do pandas, você pode usar stftime () para substituir o índice do esquema de datas '% Y-% m-% d' por uma nova forma '% b-% Y' e alguns parâmetros no gráfico .

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

xticks para especificar qual rótulo você deseja ver.

set_xticklabels para modificar a lista de rótulos.

LucaAngioloni Dec 17 2020 at 20:14

Eu sugiro que você use matplotlib e não plot de pandas, e faça algo assim para plotar as datas no formato que você especificou:

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""")

Você pode obter os dados do quadro de dados com algo como: .to_numpy()ou .values().

Consulte esta documentação para a set_xticksfunção.