Como criar linhas de grade principais e secundárias com estilos de linha diferentes em Python

122

No momento, estou usando matplotlib.pyplotpara criar gráficos e gostaria que as linhas de grade principais fossem sólidas e pretas e as secundárias acinzentadas ou tracejadas.

Nas propriedades da grade which=both/major/mine, e, em seguida, a cor e o estilo de linha são definidos simplesmente pelo estilo de linha. Existe uma maneira de especificar apenas o estilo de linha menor?

O código apropriado que tenho até agora é

plt.plot(current, counts, 'rd', markersize=8)
plt.yscale('log')
plt.grid(b=True, which='both', color='0.65', linestyle='-')
Peter Saxton
fonte

Respostas:

174

Na verdade, é tão simples quanto configurar majore minorseparadamente:

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

O problema com as grades menores é que você também precisa ter as marcas de seleção menores ativadas. No código acima, isso é feito por yscale('log'), mas também pode ser feito com plt.minorticks_on().

insira a descrição da imagem aqui

joaquin
fonte
33
Às vezes, você também precisa chamar plt.minorticks_on()a grade secundária para realmente aparecer. Consulte stackoverflow.com/a/19940830/209246
eqzx
2
Dos documentos : "Se kwargs forem fornecidos, presume-se que você deseja uma grade e b é, portanto, definido como True." - então você pode omitir b=True.
miku
Tentei fazer o mesmo com o gráfico de registro duplo. Infelizmente, o eixo x mostra apenas as espessuras principais. É possível ligar também as espessuras menores.
Alexander Cska,
1
@Alexander você precisa adicionar axis="both"parâmetro à plt.grid()função.
Kanmani
Existe uma propriedade rcParam para torná-lo o estilo padrão?
Kanmani
21

Uma maneira simples de DIY seria fazer você mesmo a grade:

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
fonte