Matplotlib: rysuj linie siatki za innymi elementami wykresu

124

W Matplotlib tworzę przerywane linie siatki w następujący sposób:

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

jednak nie mogę się dowiedzieć, jak (ani nawet jeśli jest to możliwe), aby linie siatki były rysowane za innymi elementami wykresu, takimi jak słupki. Zmiana kolejności dodawania siatki w porównaniu z dodawaniem innych elementów nie ma znaczenia.

Czy jest możliwe, aby linie siatki pojawiały się za wszystkim innym?

Andrzej
źródło
10
ax.set_axisbelow(True)nadal działa. Przyjemny również dla wyjścia PDF ...
BandGap
5
Spodziewałbym ax.set_axisbelow(True)się, że będzie to domyślny ...
PatrickT

Odpowiedzi:

122

Zgodnie z tym - http://matplotlib.1069221.n5.nabble.com/axis-elements-and-zorder-td5346.html - możesz użyćAxis.set_axisbelow(True)

(Obecnie instaluję matplotlib po raz pierwszy, więc nie mam pojęcia, czy to prawda - znalazłem to po prostu wpisując w Google "matplotlib z order grid" - "Z order" jest zwykle używane do opisania tego rodzaju rzeczy (z jest osią „poza stroną”))

Andrew Cooke
źródło
Czy można mieć linie siatki poniżej paska / linii, zachowując etykiety na górze? Opublikowałem również ten quesiton osobno stackoverflow.com/questions/29522447/ ...
joelostblom
Może to być ten matplotlib.1069221.n5.nabble.com/… , chociaż starożytny wątek.
Jacques Kvam,
86

Nie było dla mnie jasne, jak zastosować odpowiedź Andrew Cooke, więc jest to kompletne rozwiązanie oparte na tym:

ax.set_axisbelow(True)
ax.yaxis.grid(color='gray', linestyle='dashed')
Stefan
źródło
34

Jeśli chcesz sprawdzić poprawność ustawienia dla wszystkich figur, możesz ustawić

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

lub

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

Działa dla Matplotlib> = 2.0.

Syrtis Major
źródło
8

Miałem ten sam problem i działały:

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

Zwiększ 3do wyższej wartości, jeśli nie działa.

Saullo GP Castro
źródło