réduction du nombre de graduations de la parcelle


161

J'ai trop de graduations sur mon graphique et elles se rencontrent.

Comment puis-je réduire le nombre de ticks?

Par exemple, j'ai des tiques:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

Et je veux seulement:

1E-5, 1E-3, ... 1E5, 1E7

J'ai essayé de jouer avec le LogLocator, mais je n'ai pas été en mesure de comprendre cela.

Réponses:


266

Alternativement, si vous voulez simplement définir le nombre de ticks tout en permettant à matplotlib de les positionner (actuellement uniquement avec MaxNLocator), il y a pyplot.locator_params,

pyplot.locator_params(nbins=4)

Vous pouvez spécifier un axe spécifique dans cette méthode comme indiqué ci-dessous, la valeur par défaut est les deux:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
C'était une excellente suggestion, car le fait de pouvoir spécifier pyplot.locator_params(axis = 'x', nbins = 4)(ou axis = 'y') rendre le processus vraiment simple. Merci @bgamari!
benjaminmgross

8
Avec une échelle logarithmique, cela a fonctionné avec numticksau lieu denbins
meduz

1
@bgamari, pourriez-vous s'il vous plaît ajouter la numtickssolution pour les graphiques logarithmiques comme indiqué par @meduz?
Løiten

7
Cela ne semble pas placer les étiquettes là où elles devraient être. Par exemple, si les étiquettes de graduation d'origine sont [0, 1, ..., 99]et maintenant on fixe nticks=10, alors les nouvelles étiquettes clairsemées seront placées dix fois plus longtemps espacées le long de l'axe, c'est-à-dire maintenant se 1trouveront où 9était, 219était ... et 999était.
Vim

2
Vérifiez vos résultats avant de faire confiance à cette méthode. @Vim est correct. Les valeurs de graduation seront placées de manière incorrecte.
David J.

55

Si quelqu'un obtient toujours cette page dans les résultats de recherche:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
Cela a en fait fonctionné par rapport à toutes les autres réponses qui n'ont rien fait. merci :)
faizan

Bien joué. Il m'a fallu un certain temps pour le trouver, mais il a fait ce que je voulais.
John

Merci, cela garantit que les étiquettes restantes sont dans les bonnes positions. Une étape supplémentaire qui améliorerait cette réponse consiste également à supprimer la coche.
David J.

Excellente réponse simple - surpris aucune méthode personnalisée connue de la communauté SO. Ce serait un ajout précieux à lib?
jabberwocky

32

Pour résoudre le problème de la personnalisation et de l'apparence des tiques, consultez le guide des localisateurs de tiques sur le site matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Définirait le nombre total de graduations dans l'axe des x sur 3 et le répartirait uniformément sur l'axe.

Il y a aussi joli tutoriel à ce sujet


Sélectionnez uniquement les 3 premiers index datetime. quand obtenir une hache de pandas.DataFrame.plot ax = df.plot()
Mithril

@Mithril désolé je ne comprends pas très bien votre commentaire. Pourriez-vous s'il vous plaît élaborer?
Prageeth Jayathissa

Si j'ai un df ( pandas.DataFrame) avec un index datetime [2019-01-01, ... 2019-11-01], appelez ax = df.plot(), retournez un objet figure. appel ax.xaxis.set_major_locator(plt.MaxNLocator(3)) uniquement afficher les 3 premiers index [2019-01-01, 2019-01-02, 2019-01-03].
Mithril

1
@Mithril df.plot()affiche souvent le minor_locator, donc vous voudrez peut-être essayer ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). N'oubliez pas de remplacer le 3nombre de graduations que vous souhaitez afficher. Pour les séries chronologiques de pandas que je recommande import matplotlib.dates as mdateset que je cours ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))avecax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

Il existe une set_ticks()fonction pour les objets d'axe.


4
Cela fonctionnerait si je savais à l'avance quelles tiques je voulais. L'exemple que j'ai donné ci-dessus n'était qu'un exemple. Je ne sais pas ce que sont les tiques, je sais juste que j'en veux moins, c'est-à-dire toutes les autres.
jlconlin

10
Vous pouvez appeler get_xticks()ou d' get_yticks()abord pour l'objet axes, modifier si nécessaire, puis renvoyer la liste à set_ticks().
user812786

4
Je n'ai pas set_ticks(), mais j'ai set_xticks()et set_yticks(). Ce sont des attributs d'objets axes, pas d'axes. Peut-être que cela a changé au cours des deux dernières années.
Gauthier

2
Je ne sais pas si je devrais le faire, certaines personnes ont trouvé votre réponse utile telle quelle, et ce n'est pas parce que c'est différent pour moi que cela s'adresse à tout le monde.
Gauthier

1
Un exemple contribuerait grandement à rendre cette réponse utile.
Richard

10

au cas où quelqu'un en aurait encore besoin, et comme rien ici n'a vraiment fonctionné pour moi, j'ai trouvé un moyen très simple qui garde l'apparence du tracé généré "tel quel" tout en fixant le nombre de graduations à exactement N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
J'ai dû modifier légèrement la dernière ligne pour qu'elle renvoie les valeurs comme int au lieu de float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje flotte toujours avec moi!
Mohd

4

La solution fournie par @raphael est simple et très utile.

Néanmoins, les étiquettes de graduation affichées ne seront pas des valeurs échantillonnées à partir de la distribution d'origine mais à partir des index du tableau renvoyés par np.linspace(ymin, ymax, N).

Pour afficher N valeurs régulièrement espacées de vos étiquettes de graduation d'origine, utilisez la set_yticklabels()méthode. Voici un extrait de code pour l'axe y, avec des étiquettes entières:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

Bravo pour ce joli tweak!
Mohd

2

Lorsqu'une échelle logarithmique est utilisée, le nombre de graduations principales peut être fixé avec la commande suivante

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

La valeur définie sur numticksdétermine le nombre de graduations d'axe à afficher.

Crédits à la publication de @ bgamari pour l'introduction de la locator_params()fonction, mais le nticksparamètre renvoie une erreur lorsqu'une échelle logarithmique est utilisée.


La question et la réponse concernent le matplotlib précédent, c'est-à-dire 1, et vous faites référence à 2.
Dawid Laszuk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.