web-dev-qa-db-fra.com

Matplotlib montrant les étiquettes x-tick qui se chevauchent malgré tous les efforts

Jetez un œil au graphique ci-dessous: enter image description here

C'est une sous-intrigue de cette figure plus grande: enter image description here

Je vois deux problèmes avec cela. Tout d'abord, les étiquettes de l'axe des x se chevauchent (c'est mon problème majeur). Seconde. l'emplacement des lignes de grille mineures de l'axe x semble un peu chancelant. À gauche du graphique, ils semblent correctement espacés. Mais à droite, ils semblent encombrer les principaux quadrillages ... comme si les emplacements des quadrillages principaux n'étaient pas des multiples appropriés des emplacements des graduations mineures.

Ma configuration est que j'ai un DataFrame appelé df qui a un DatetimeIndex sur les lignes et une colonne appelée value qui contient des flottants. Je peux fournir un exemple du contenu df dans un Gist si nécessaire. Une douzaine de lignes de df sont au bas de ce message pour référence.

Voici le code qui produit la figure:

now = dt.datetime.now()

fig, axes = plt.subplots(2, 2, figsize=(15, 8), dpi=200)
for i, d in enumerate([360, 30, 7, 1]):
    ax = axes.flatten()[i]
    earlycut = now - relativedelta(days=d)
    data = df.loc[df.index>=earlycut, :]
    ax.plot(data.index, data['value'])
    ax.xaxis_date()

    ax.get_xaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())
    ax.get_yaxis().set_minor_locator(mpl.ticker.AutoMinorLocator())

    ax.grid(b=True, which='major', color='w', linewidth=1.5)
    ax.grid(b=True, which='minor', color='w', linewidth=0.75)

Quelle est ma meilleure option ici pour que les étiquettes de l'axe des x cessent de se chevaucher (dans chacune des quatre sous-parcelles)? En outre, séparément (mais de manière moins urgente), que se passe-t-il avec le problème de coche mineur dans la sous-intrigue en haut à gauche?

Je suis sur Pandas 0.13.1, numpy 1.8.0 et matplotlib 1.4.x.

Voici un petit extrait de df pour référence:

                                    id scale  tempseries_id    value
timestamp                                                           
2014-11-02 14:45:10.302204+00:00  7564     F              1  68.0000
2014-11-02 14:25:13.532391+00:00  7563     F              1  68.5616
2014-11-02 14:15:12.102229+00:00  7562     F              1  68.9000
2014-11-02 14:05:13.252371+00:00  7561     F              1  69.0116
2014-11-02 13:55:11.792191+00:00  7560     F              1  68.7866
2014-11-02 13:45:10.782227+00:00  7559     F              1  68.6750
2014-11-02 13:35:10.972248+00:00  7558     F              1  68.4500
2014-11-02 13:25:10.362213+00:00  7557     F              1  68.1116
2014-11-02 13:15:10.822247+00:00  7556     F              1  68.2250
2014-11-02 13:05:10.102200+00:00  7555     F              1  68.5616
2014-11-02 12:55:10.292217+00:00  7554     F              1  69.0116
2014-11-02 12:45:10.382226+00:00  7553     F              1  69.3500
2014-11-02 12:35:10.642245+00:00  7552     F              1  69.2366
2014-11-02 12:25:12.642255+00:00  7551     F              1  69.1250
2014-11-02 12:15:11.122382+00:00  7550     F              1  68.7866
2014-11-02 12:05:11.332224+00:00  7549     F              1  68.5616
2014-11-02 11:55:11.662311+00:00  7548     F              1  68.2250
2014-11-02 11:45:11.122193+00:00  7547     F              1  68.4500
2014-11-02 11:35:11.162271+00:00  7546     F              1  68.7866
2014-11-02 11:25:12.102211+00:00  7545     F              1  69.2366
2014-11-02 11:15:10.422226+00:00  7544     F              1  69.4616
2014-11-02 11:05:11.412216+00:00  7543     F              1  69.3500
2014-11-02 10:55:10.772212+00:00  7542     F              1  69.1250
2014-11-02 10:45:11.332220+00:00  7541     F              1  68.7866
2014-11-02 10:35:11.332232+00:00  7540     F              1  68.5616
2014-11-02 10:25:11.202411+00:00  7539     F              1  68.2250
2014-11-02 10:15:11.932326+00:00  7538     F              1  68.5616
2014-11-02 10:05:10.922229+00:00  7537     F              1  68.9000
2014-11-02 09:55:11.602357+00:00  7536     F              1  69.3500

Edit: Essayer fig.autofmt_xdate(): Je ne pense pas que cela va faire l'affaire. Cela semble utiliser les mêmes étiquettes x-tick pour les deux graphiques à gauche et également pour les deux graphiques à droite. Ce qui n'est pas correct compte tenu de mes données. Veuillez voir la sortie problématique ci-dessous:

enter image description here

32
8one6

En raison de la façon dont le rendu du texte est géré dans matplotlib, la détection automatique du texte qui se chevauche ralentit vraiment les choses. (L'espace occupé par le texte ne peut être calculé avec précision qu'après avoir été dessiné.) Pour cette raison, matplotlib n'essaie pas de le faire automatiquement.

Par conséquent, il est préférable de faire pivoter les longues étiquettes de tick. Parce que les dates ont le plus souvent ce problème, il existe une méthode de figure fig.autofmt_xdate() qui fera (entre autres) tourner les étiquettes de tick pour les rendre un peu plus lisibles. (Remarque: si vous utilisez une méthode pandas plot, elle retourne un objet axes, vous devrez donc utiliser ax.figure.autofmt_xdate().)

Comme exemple rapide:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

time = pd.date_range('01/01/2014', '4/01/2014', freq='H')
values = np.random.normal(0, 1, time.size).cumsum()

fig, ax = plt.subplots()
ax.plot_date(time, values, marker='', linestyle='-')

fig.autofmt_xdate()
plt.show()

Si nous devions laisser fig.autofmt_xdate() en dehors:

enter image description here

Et si nous utilisons fig.autofmt_xdate():

enter image description here

12
Joe Kington