Wyświetlanie pionowych linii siatki na wykresie linii w matplotlib

95

Chcę uzyskać na wykresie zarówno poziome, jak i pionowe linie siatki, ale domyślnie pojawiają się tylko poziome linie siatki. Używam pandas.DataFramez kwerendy sql w Pythonie, aby wygenerować wykres liniowy z datami na osi x. Nie jestem pewien, dlaczego nie pojawiają się one w datach i próbowałem znaleźć odpowiedź na to pytanie, ale nie mogłem jej znaleźć.

Wszystko, czego użyłem do wykreślenia wykresu, to prosty kod poniżej.

data.plot()
grid('on')

data to DataFrame, która zawiera daty i dane z zapytania sql.

Próbowałem również dodać poniższy kod, ale nadal otrzymuję ten sam wynik bez pionowych linii siatki.

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

Jakieś sugestie?

wprowadź opis obrazu tutaj

Osmond Bishop
źródło
data.plot(grid="on")pracował dla mnie
Markus

Odpowiedzi:

101

W wywołaniach może być konieczne podanie argumentu logicznego, np. Użyj ax.yaxis.grid(True)zamiast ax.yaxis.grid(). Dodatkowo, ponieważ używasz obu z nich, możesz łączyć w ax.grid, co działa na obu, zamiast robić to raz dla każdego wymiaru.

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

To powinno cię rozwiązać.

wim
źródło
Wypróbowałem, ale z jakiegoś powodu nadal wygląda tak samo jak poprzednio
Osmond Bishop
1
Czy robisz to w interaktywnym tłumaczu? Upewnij się, że ustawiasz siatkę, zanim zadzwoniszplt.show()
wim
Używam iPythona. Próbowałem dodać plt.show () to nie zrobi różnicy.
Osmond Bishop
1
Cóż, to jest dziwne. Jaka jest twoja wersja ipythona, spróbuj też uruchomić ją jak ipython --pylabi plt.grid(True)od razu - czy widzisz siatkę?
wim
Próbowałem plt.grid(True)i otrzymałem pusty wykres z pionowymi i poziomymi liniami siatki, więc tak, to dziwne, dlaczego nie mogę tego uzyskać dla mojego wykresu liniowego. Używam najnowszej dostępnej wersji iPythona.
Osmond Bishop
59

plt.gca().xaxis.grid(True) okazało się dla mnie rozwiązaniem

matowe
źródło
6
To myaxes.grid(which='x')nie działało dla mnie z matplotlib w wersji 1.4.2 ... nie mogłem w ogóle zmusić whichsłowa kluczowego do działania. Jednak myaxes.xaxis.grid(True)załatwił sprawę i jest koncepcyjnie lepszy IMO. Aha, i nie zapomnij o użytecznej myaxes.set_axisbelow(True)metodzie umieszczania siatki za danymi.
travc
27

Zgodnie z dokumentacją matplotlib , sygnatura metody Axesklasy grid()wygląda następująco:

Axes.grid (b = None, which = 'major', axis = 'both', ** kwargs)
Włącz lub wyłącz siatki osi.

which może mieć wartość „major” (wartość domyślna), „minor” lub „both”, aby określić, czy dotyczy to głównych siatek tików, mniejszych siatek tików, czy też obu.

axis może mieć wartość „oba” (domyślnie), „x” lub „y”, aby kontrolować, który zestaw linii siatki jest rysowany.

Aby wyświetlić linie siatki zarówno dla osi x, jak i osi y, możemy użyć następującego kodu:

ax = plt.gca()
ax.grid(which='major', axis='both', linestyle='--')

Ta metoda daje nam większą kontrolę nad tym, co wyświetlać na liniach siatki.

jdhao
źródło
7

może to rozwiąże problem: matplotlib, zdefiniuj rozmiar siatki na działce

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

Prawda jest taka, że ​​siatka działa, ale jest tylko jedna siatka V o godzinie 00:00 i nie ma siatki w innych. Spotykam się z tym samym problemem, że w dniu 1 listopada jest tylko jedna siatka na wiele dni.

Lory_yang
źródło
3

Krótka odpowiedź (więcej informacji poniżej):

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

wprowadź opis obrazu tutaj

To, co robisz, jest poprawne i powinno działać.

Ponieważ jednak oś X w naszym przykładzie jest osią DateTime, główne znaczniki (najprawdopodobniej) pojawiają się tylko na obu końcach osi X. Inne widoczne znaczniki to Drobne znaczniki.

ax.grid()Metoda domyślnie rysuje linie siatki na głównych tick-znaków. Dlatego nic nie pojawia się w twojej fabule.

Użyj poniższego kodu, aby zaznaczyć znaczniki. Major będzie niebieski, a drugorzędny czerwony.

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

Teraz, aby wymusić, aby linie siatki pojawiały się również na drobnych znacznikach, przekaż which='minor'do metody:

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

lub po prostu użyj, which='both'aby narysować główne i drugorzędne linie siatki. A to bardziej elegancka linia siatki:

ax.grid(b=True, which='minor', axis='both', color='#888888', linestyle='--')
ax.grid(b=True, which='major', axis='both', color='#000000', linestyle='-')
Ciemny
źródło
1

Tylko dla linii poziomych

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

To zadziałało

Błoto
źródło