web-dev-qa-db-fra.com

pandas .plot () fréquence des ticks sur l’axe x - comment puis-je afficher plus de ticks?

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  data set

Voici le résultat du .plot ()

 enter image description here

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?

8
Rotkiv

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

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)

2
Rotkiv

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:

 enter image description here

J'espère que cela t'aides!

2
Cord Kaldemeyer

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'

0
flying sheep