Faire apparaître le quadrillage vertical dans le tracé linéaire dans matplotlib

93

Je veux obtenir des lignes de grille horizontales et verticales sur mon tracé, mais seules les lignes de grille horizontales apparaissent par défaut. J'utilise pandas.DataFrameune 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 rechercher une réponse à cela mais je n'ai pas pu en trouver.

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

Aucune suggestion?

entrez la description de l'image ici

Osmond Bishop
la source
data.plot(grid="on")travaillé pour moi
Markus

Réponses:

101

Vous devrez peut-être donner un argument booléen dans vos appels, par exemple utiliser à la ax.yaxis.grid(True)place de ax.yaxis.grid(). De plus, comme vous les utilisez tous les deux, vous pouvez les combiner ax.grid, ce qui fonctionne sur les deux, plutôt que de le faire une fois pour chaque dimension.

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

Cela devrait vous trier.

wim
la source
Je l'ai essayé mais pour une raison quelconque, il a toujours le même aspect qu'avant
Osmond Bishop
1
Faites-vous cela dans un interprète interactif? Assurez-vous de définir la grille avant d' appelerplt.show()
wim
J'utilise iPython. J'ai essayé d'ajouter plt.show () cela ne fera aucune différence.
Osmond Bishop
1
Eh bien, c'est étrange. Quelle est votre version ipython, essayez également de l'exécuter comme ipython --pylab, et faites-le plt.grid(True)immédiatement - voyez-vous la grille?
wim
J'ai essayé d' plt.grid(True)obtenir le graphique vide avec les lignes de grille verticales et horizontales, donc oui, il est étrange que je ne puisse pas obtenir cela pour mon tracé linéaire. J'utilise la dernière version disponible d'iPython.
Osmond Bishop
57

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

mat
la source
6
Le myaxes.grid(which='x')ne fonctionnait pas pour moi avec matplotlib version 1.4.2 ... ne pouvait pas du tout faire fonctionner le whichmot - clé. Cependant, a myaxes.xaxis.grid(True)fait l'affaire et est conceptuellement mieux IMO. Oh, et n'oubliez pas la myaxes.set_axisbelow(True)méthode utile pour mettre la grille derrière les données.
travc
25

Selon la documentation de matplotlib , la signature de la méthode de Axesclasse grid()est la suivante:

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

which peut être «majeur» (par défaut), «mineur» ou «les deux» pour contrôler si les grilles de graduation principales, les grilles de graduation mineures ou les deux sont affectées.

axis peut être «les deux» (par défaut), «x» ou «y» pour contrôler le jeu de quadrillage dessiné.

Ainsi, afin d'afficher les lignes de la grille pour l'axe x et l'axe 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 qu'il faut afficher pour les lignes de la grille.

jdhao
la source
6

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

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 qu'il n'y a qu'une seule grille au 1er novembre sur plusieurs jours.

Lory_yang
la source
3

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

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

entrez la description de l'image ici

Ce que vous faites est correct et cela devrait fonctionner.

Cependant, puisque l' axe X dans votre exemple est un axe DateHeure, les graduations Majeures (très probablement) n'apparaissent qu'aux deux extrémités de l'axe X. Les autres graduations visibles sont des graduations mineures .

La ax.grid()méthode, par défaut, dessine des lignes de quadrillage sur les graduations principales. Par conséquent, rien n'apparaît dans votre intrigue.

Utilisez le code ci-dessous pour mettre en surbrillance les graduations. Les majors seront bleus tandis que les mineurs seront rouges.

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 graduations mineures, passez le which='minor'à la méthode:

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

ou utilisez simplement which='both'pour dessiner des lignes de grille majeures et mineures. Et ceci 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='-')
Sombre
la source
1

Pour uniquement les lignes horizontales

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

Cela a fonctionné

Mudit
la source