Cómo crear líneas de cuadrícula mayores y menores con diferentes estilos de línea en Python

122

Actualmente estoy usando matplotlib.pyplotpara crear gráficos y me gustaría tener las líneas de cuadrícula principales sólidas y negras y las menores en gris o discontinuas.

En las propiedades de la cuadrícula which=both/major/mine,, y luego el color y el estilo de línea se definen simplemente por estilo de línea. ¿Hay alguna forma de especificar solo el estilo de línea menor?

El código apropiado que tengo hasta ahora es

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

Respuestas:

174

En realidad, es tan simple como configurar majory por minorseparado:

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

El problema con las cuadrículas menores es que también debes tener activadas las marcas de verificación menores. En el código anterior esto se hace con yscale('log'), pero también se puede hacer con plt.minorticks_on().

ingrese la descripción de la imagen aquí

Joaquín
fuente
33
A veces también necesita llamar plt.minorticks_on()para que aparezca la cuadrícula menor. Ver stackoverflow.com/a/19940830/209246
eqzx
2
De los documentos : "Si se proporcionan kwargs, se supone que desea una cuadrícula y, por lo tanto, b se establece en True". - por lo que podría omitir b=True.
Miku
He intentado hacer lo mismo con el diagrama de doble registro. Desafortunadamente, el eje x muestra solo los grosores principales. ¿Es posible encender también los espesores menores?
Alexander Cska
1
@Alexander necesitas agregar un axis="both"parámetro a la plt.grid()función.
Kanmani
¿Existe una propiedad rcParam para convertir esto en el estilo predeterminado?
Kanmani
21

Una forma sencilla de hacerlo tú mismo sería hacer la cuadrícula tú mismo:

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
fuente