Je dessine des séries chronologiques à l'aide de pandas .plot () et je veux voir chaque mois s'afficher sous la forme d'un tick en X.
Voici la structure du jeu de données
Voici le résultat du .plot ()
J'essayais d'utiliser des exemples d'autres publications et de matplotlib documentation et de faire quelque chose comme:
ax.xaxis.set_major_locator(
dates.MonthLocator(revenue_pivot.index, bymonthday=1,interval=1))
Mais cela a enlevé toutes les tiques :(
J'ai aussi essayé de passer xticks = df.index
, mais cela n'a rien changé.
Quel serait le meilleur moyen d'afficher plus de ticks sur l'axe des x?
Pas besoin de passer d'arguments à MonthLocator
. Veillez à utiliser x_compat
dans l'appel df.plot()
par réponse de @ Rotkiv.
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates
df = pd.DataFrame(np.random.Rand(100,2), index=pd.date_range('1-1-2018', periods=100))
ax = df.plot(x_compat=True)
ax.xaxis.set_major_locator(mdates.MonthLocator())
plt.show()
La bonne façon de faire ce qui est décrit ici En utilisant le paramètre x_compat, il est possible de supprimer le réglage automatique de la résolution des ticks
df.A.plot(x_compat=True)
Vous pouvez également formater "manuellement" les ticks et les axes d'un axe pandas DateTimeIndex
à l'aide des attributs d'un objet pandas Timestamp
.
J'ai trouvé cela beaucoup plus facile que d'utiliser des localisateurs de matplotlib.dates
qui fonctionnent sur d'autres formats de datetime que des pandas (si je ne me trompe pas) et présentent donc parfois un comportement étrange si les dates ne sont pas converties en conséquence.
Voici un exemple générique qui montre le premier jour de chaque mois comme une étiquette basée sur les attributs des objets pandas Timestamp
:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# data
dim = 8760
idx = pd.date_range('1/1/2000 00:00:00', freq='h', periods=dim)
df = pd.DataFrame(np.random.randn(dim, 2), index=idx)
# select tick positions based on timestamp attribute logic. see:
# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Timestamp.html
positions = [p for p in df.index
if p.hour == 0
and p.is_month_start
and p.month in range(1, 13, 1)]
# for date formatting, see:
# https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
labels = [l.strftime('%m-%d') for l in positions]
# plot with adjusted labels
ax = df.plot(kind='line', grid=True)
ax.set_xlabel('Time (h)')
ax.set_ylabel('Foo (Bar)')
ax.set_xticks(positions)
ax.set_xticklabels(labels)
plt.show()
rendements:
J'espère que cela t'aides!
Si vous souhaitez simplement afficher plus de ticks, vous pouvez également plonger profondément dans la structure de pd.plotting._converter :
dai = ax.xaxis.minor.formatter.plot_obj.date_axis_info
dai['fmt'][dai['fmt'] == b''] = b'%b'
Après le traçage, la formatter
est un TimeSeries_DateFormatter
et _set_default_format
a été appelé, donc self.plot_obj.date_axis_info is not None
. Vous pouvez maintenant manipuler le tableau structuré .date_axis_info
à votre guise, à savoir contenir moins b''
et plus b'%b'