Jak tworzyć główne i pomocnicze linie siatki z różnymi stylami linii w Pythonie

122

Obecnie używam matplotlib.pyplotdo tworzenia wykresów i chciałbym, aby główne linie siatki były pełne i czarne, a pomniejsze były szare lub przerywane.

We właściwościach siatki which=both/major/mine, a następnie kolor i styl linii są definiowane po prostu przez styl linii. Czy istnieje sposób, aby określić tylko mniejszy styl linii?

Odpowiedni kod, jaki mam do tej pory, to

plt.plot(current, counts, 'rd', markersize=8)
plt.yscale('log')
plt.grid(b=True, which='both', color='0.65', linestyle='-')
Peter Saxton
źródło

Odpowiedzi:

174

W rzeczywistości jest to tak proste, jak ustawienie majori minorosobno:

In [9]: plot([23, 456, 676, 89, 906, 34, 2345])
Out[9]: [<matplotlib.lines.Line2D at 0x6112f90>]

In [10]: yscale('log')

In [11]: grid(b=True, which='major', color='b', linestyle='-')

In [12]: grid(b=True, which='minor', color='r', linestyle='--')

Problem z małymi siatkami polega na tym, że musisz mieć włączone również drobne znaczniki. W powyższym kodzie jest to zrobione przez yscale('log'), ale można to również zrobić za pomocą plt.minorticks_on().

wprowadź opis obrazu tutaj

joaquin
źródło
33
Czasami trzeba również wezwać plt.minorticks_on()do pojawienia się drugorzędnej siatki. Zobacz stackoverflow.com/a/19940830/209246
eqzx
2
Z dokumentacji : "Jeśli podano kwargi, zakłada się, że chcesz grid, a b jest więc ustawione na True." - więc możesz pominąć b=True.
miku
Próbowałem zrobić to samo z podwójnym wykresem dziennika. Niestety oś X pokazuje tylko główne grubości. Czy można włączyć również drobne groty.
Alexander Cska
1
@Alexander, musisz dodać axis="both"parametr do plt.grid()funkcji.
Kanmani
Czy istnieje właściwość rcParam, aby ustawić ten styl jako domyślny?
Kanmani
21

Prostym sposobem na majsterkowanie byłoby samodzielne wykonanie siatki:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot([1,2,3], [2,3,4], 'ro')

for xmaj in ax.xaxis.get_majorticklocs():
  ax.axvline(x=xmaj, ls='-')
for xmin in ax.xaxis.get_minorticklocs():
  ax.axvline(x=xmin, ls='--')

for ymaj in ax.yaxis.get_majorticklocs():
  ax.axhline(y=ymaj, ls='-')
for ymin in ax.yaxis.get_minorticklocs():
  ax.axhline(y=ymin, ls='--')
plt.show()
ev-br
źródło