108 votes

Faire apparaître des lignes de grille verticales dans un tracé linéaire en matplotlib

Je souhaite obtenir des lignes de grille horizontales et verticales sur mon tracé, mais seules les lignes de grille horizontales apparaissent par défaut. J'utilise un pandas.DataFrame à partir d'une requête sql en python pour générer un graphique linéaire avec des dates sur l'axe des x. Je ne sais pas pourquoi ils n'apparaissent pas sur les dates et j'ai essayé de chercher une réponse à ce sujet mais je n'en ai pas trouvé.

Tout ce que j'ai utilisé pour tracer le graphique est le code simple ci-dessous.

data.plot()
grid('on')

data est le DataFrame qui contient les dates et les données de la requête sql.

J'ai également essayé d'ajouter le code ci-dessous, mais j'obtiens toujours le même résultat, sans lignes de grille verticales.

ax = plt.axes()        
ax.yaxis.grid() # horizontal lines
ax.xaxis.grid() # vertical lines

Des suggestions ?

enter image description here

111voto

wim Points 35274

Vous pouvez avoir besoin de donner des arguments booléens dans vos appels, par exemple en utilisant ax.yaxis.grid(True) au lieu de ax.yaxis.grid() . De plus, puisque vous utilisez les deux, vous pouvez les combiner en ax.grid qui fonctionne sur les deux, plutôt que de le faire une fois pour chaque dimension.

ax = plt.gca()
ax.grid(True)

Ça devrait vous arranger.

66voto

matt Points 661

plt.gca().xaxis.grid(True) s'est avéré être la solution pour moi

32voto

jdhao Points 3136

Selon la documentation de matplotlib La signature de la Axes classe grid() est la suivante :

Axes.grid(b=None, which='major', axis='both', **kwargs)
Activez ou désactivez les grilles d'axes.

which peut être "majeure" (par défaut), "mineure" ou "les deux" pour contrôler si les grilles de points majeurs, les grilles de points mineurs, ou les deux.

axis peut être 'both' (par défaut), 'x', ou 'y' pour contrôler quel ensemble d'informations de de lignes de grille sont dessinées.

Ainsi, afin d'afficher les lignes de la grille pour les axes x et y, nous pouvons utiliser le code suivant :

ax = plt.gca()
ax.grid(which='major', axis='both', linestyle='--')

Cette méthode nous donne un contrôle plus fin sur ce qui doit être affiché pour les lignes de la grille.

10voto

Dark Points 28

Réponse courte (lire ci-dessous pour plus d'informations) :

ax.grid(axis='both', which='both')

enter image description here

Ce que vous faites est correct et devrait fonctionner.

Toutefois, étant donné que le X dans votre exemple est un DateTime axe le Major Les marques de tic-tac (très probablement) apparaissent uniquement aux deux extrémités de l'axe X. Les autres marques visibles sont Mineur marques de tique.

El ax.grid() dessine, par défaut, des lignes de grille sur les repères majeurs. Par conséquent, rien n'apparaît dans votre tracé.

Utilisez le code ci-dessous pour mettre en évidence les marques de coche. Les majors seront en bleu et les minimes en rouge.

ax.tick_params(which='both', width=3)
ax.tick_params(which='major', length=20, color='b')
ax.tick_params(which='minor', length=10, color='r')

Maintenant, pour forcer les lignes de la grille à apparaître également sur les marques mineures, passez l'attribut which='minor' à la méthode :

ax.grid(b=True, which='minor', axis='x', color='#000000', linestyle='--')

ou simplement utiliser which='both' pour dessiner des lignes de grille majeures et mineures. Et voici une ligne de grille plus élégante :

ax.grid(b=True, which='minor', axis='both', color='#888888', linestyle='--')
ax.grid(b=True, which='major', axis='both', color='#000000', linestyle='-')

8voto

Lory_yang Points 363

Peut-être que cela peut résoudre le problème : matplotlib, définir la taille d'une grille sur un graphique

ax.grid(True, which='both')

La vérité est que la grille fonctionne, mais il n'y a qu'une seule v-grid à 00:00 et aucune grille dans les autres. Je rencontre le même problème : il n'y a qu'une seule grille le 1er novembre parmi de nombreux jours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X