Matplotlib: draw grid lines behind other graph elements

PythonMatplotlibGrid

Python Problem Overview


In Matplotlib, I make dashed grid lines as follows:

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

however, I can't find out how (or even if it is possible) to make the grid lines be drawn behind other graph elements, such as bars. Changing the order of adding the grid versus adding other elements makes no difference.

Is it possible to make it so that the grid lines appear behind everything else?

Python Solutions


Solution 1 - Python

According to this - http://matplotlib.1069221.n5.nabble.com/axis-elements-and-zorder-td5346.html - you can use Axis.set_axisbelow(True)

(I am currently installing matplotlib for the first time, so have no idea if that's correct - I just found it by googling "matplotlib z order grid" - "z order" is typically used to describe this kind of thing (z being the axis "out of the page"))

Solution 2 - Python

To me, it was unclear how to apply andrew cooke's answer, so this is a complete solution based on that:

ax.set_axisbelow(True)
ax.yaxis.grid(color='gray', linestyle='dashed')

Solution 3 - Python

If you want to validate the setting for all figures, you may set

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

or

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

It works for Matplotlib>=2.0.

Solution 4 - Python

I had the same problem and the following worked:

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

Increase 3to a higher value if it does not work.

Solution 5 - Python

You can try to use one of Seaborn's styles. For instance:

import seaborn as sns  
sns.set_style("whitegrid")

Not only the gridlines will get behind but the looks are nicer.

Solution 6 - Python

You can also set the zorder kwarg in matplotlib.pyplot.grid

plt.grid(which='major', axis='y', zorder=-1.0)

Solution 7 - Python

For some (like me) it might be interesting to draw the grid behind only "some" of the other elements. For granular control of the draw order, you can use matplotlib.artist.Artist.set_zorder on the axes directly:

ax.yaxis.grid(color='gray', linestyle='dashed')
ax.set_zorder(3)

This is mentioned in the notes on matplotlib.axes.Axes.grid.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrewView Question on Stackoverflow
Solution 1 - Pythonandrew cookeView Answer on Stackoverflow
Solution 2 - PythonStefanView Answer on Stackoverflow
Solution 3 - PythonSyrtis MajorView Answer on Stackoverflow
Solution 4 - PythonSaullo G. P. CastroView Answer on Stackoverflow
Solution 5 - PythonAlvaro FuentesView Answer on Stackoverflow
Solution 6 - PythonUsman TariqView Answer on Stackoverflow
Solution 7 - PythonChristianView Answer on Stackoverflow