Matplotlib: dessinez des lignes de quadrillage derrière d'autres éléments du graphique

124

Dans Matplotlib, je crée des lignes de grille en pointillés comme suit:

fig = pylab.figure()    
ax = fig.add_subplot(1,1,1)
ax.yaxis.grid(color='gray', linestyle='dashed')

cependant, je ne peux pas savoir comment (ou même s'il est possible) faire en sorte que les lignes de la grille soient dessinées derrière d'autres éléments du graphique, tels que des barres. Changer l'ordre d'ajout de la grille par rapport à l'ajout d'autres éléments ne fait aucune différence.

Est-il possible de faire en sorte que les lignes de la grille apparaissent derrière tout le reste?

Andrew
la source
10
ax.set_axisbelow(True)fonctionne encore. Aussi bien pour la sortie pdf ...
BandGap
5
Je me serais attendu ax.set_axisbelow(True)à être la valeur par défaut ...
PatrickT

Réponses:

122

Selon ceci - http://matplotlib.1069221.n5.nabble.com/axis-elements-and-zorder-td5346.html - vous pouvez utiliserAxis.set_axisbelow(True)

(J'installe actuellement matplotlib pour la première fois, donc je n'ai aucune idée si c'est correct - je viens de le trouver en googlant "matplotlib z order grid" - "z order" est généralement utilisé pour décrire ce genre de chose (z étant l'axe "hors de la page"))

Andrew Cooke
la source
Est-il possible d'avoir le quadrillage sous la barre / ligne tout en conservant les étiquettes en haut? J'ai également posté cette question séparément stackoverflow.com/questions/29522447/…
joelostblom
Ce pourrait être ce matplotlib.1069221.n5.nabble.com/... , ancien fil de discussion.
Jacques Kvam
86

Pour moi, on ne savait pas comment appliquer la réponse d'Andrew Cooke, c'est donc une solution complète basée sur cela:

ax.set_axisbelow(True)
ax.yaxis.grid(color='gray', linestyle='dashed')
Stefan
la source
34

Si vous souhaitez valider le réglage pour tous les chiffres, vous pouvez définir

plt.rc('axes', axisbelow=True)

ou

plt.rcParams['axes.axisbelow'] = True

Cela fonctionne pour Matplotlib> = 2.0.

Syrtis Major
la source
8

J'ai eu le même problème et ce qui suit a fonctionné:

[line.set_zorder(3) for line in ax.lines]
fig.show() # to update

Augmentez 3à une valeur plus élevée si cela ne fonctionne pas.

Saullo GP Castro
la source