Comment créer des quadrillages majeurs et mineurs avec différents styles de ligne en Python

122

J'utilise actuellement matplotlib.pyplotpour créer des graphiques et j'aimerais avoir les grandes lignes de quadrillage pleines et noires et les mineures grisées ou en pointillés.

Dans les propriétés de la grille which=both/major/mine,, puis la couleur et le style de ligne sont définis simplement par le style de ligne. Existe-t-il un moyen de spécifier uniquement le style de ligne mineur?

Le code approprié que j'ai jusqu'à présent est

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

Réponses:

174

En fait, c'est aussi simple que le réglage majoret minorséparément:

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

Le problème avec les grilles mineures est que vous devez également activer les marques mineures. Dans le code ci-dessus, cela se fait par yscale('log'), mais cela peut également être fait avec plt.minorticks_on().

entrez la description de l'image ici

Joaquin
la source
33
Parfois, vous devez également appeler plt.minorticks_on()pour que la grille mineure apparaisse réellement. Voir stackoverflow.com/a/19940830/209246
eqzx
2
D'après la documentation : "Si kwargs sont fournis, on suppose que vous voulez une grille et b est donc défini sur True." - donc vous pourriez omettre b=True.
miku
J'ai essayé de faire la même chose avec un graphique à double journal. Malheureusement, l'axe des abscisses ne montre que les épaisseurs majeures. Est-il possible d'activer également les épaisseurs mineures.
Alexander Cska
1
@Alexander, vous devez ajouter un axis="both"paramètre à la plt.grid()fonction.
Kanmani
Existe-t-il une propriété rcParam pour en faire le style par défaut?
Kanmani
21

Une manière simple de faire du bricolage serait de faire la grille vous-même:

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
la source