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


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.


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


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.


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.


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='-')

1

Pour uniquement les lignes horizontales

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

Cela a fonctionné

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.