J'essaie de corriger la façon dont python trace mes données.
Dire
x = [0,5,9,10,15]
et
y = [0,1,2,3,4]
Ensuite, je ferais:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
et les graduations de l'axe x sont tracées à des intervalles de 5. Existe-t-il un moyen de lui faire afficher des intervalles de 1?
python
matplotlib
Dax Feliz
la source
la source
pyplot.locator_params(nbins=4)
Réponses:
Vous pouvez définir explicitement où vous souhaitez cocher les marques avec
plt.xticks
:Par exemple,
(a
np.arange
été utilisé plutôt que larange
fonction de Python juste au cas oùmin(x)
etmax(x)
sont des flottants au lieu d'ints.)La fonction
plt.plot
(ouax.plot
) définira automatiquement les valeurs par défautx
et lesy
limites. Si vous souhaitez conserver ces limites et simplement modifier la taille des pas des graduations, vous pouvez utiliserax.get_xlim()
pour découvrir quelles limites Matplotlib a déjà définies.Le formateur de tick par défaut devrait faire un travail décent en arrondissant les valeurs de tick à un nombre sensible de chiffres significatifs. Cependant, si vous souhaitez avoir plus de contrôle sur le format, vous pouvez définir votre propre formateur. Par exemple,
Voici un exemple exécutable:
la source
+1
entréeplt.xticks(np.arange(min(x), max(x)+1, 1.0))
est requise pour afficher la dernière coche.np.arange(start, stop)
génère des valeurs dans l' intervalle semi-ouvert[start, stop)
, incluantstart
mais excluantstop
. J'ai donc l'habitudemax(x)+1
de m'assurer que celamax(x)
est inclus.plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)
? il ne semble que tracer l'annéeUne autre approche consiste à définir le localisateur d'axe:
Il existe plusieurs types de localisateurs selon vos besoins.
Voici un exemple complet:
la source
matplotlib.dates.AutoDateLocator()
base=1.0
signifie / fait réellement?J'aime cette solution (tirée du livre de recettes de traçage Matplotlib ):
Cette solution vous donne un contrôle explicite de l'espacement des graduations via le nombre donné à
ticker.MultipleLocater()
, permet une détermination automatique des limites et est facile à lire plus tard.la source
Dans le cas où quelqu'un est intéressé par un one-liner général, obtenez simplement les ticks actuels et utilisez-le pour définir les nouveaux ticks en échantillonnant tous les autres ticks.
la source
ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
C'est un peu hacky, mais de loin l'exemple le plus propre / le plus facile à comprendre que j'ai trouvé pour le faire. C'est à partir d'une réponse sur SO ici:
Le moyen le plus propre de masquer chaque étiquette de nième tique dans la barre de couleurs matplotlib?
Ensuite, vous pouvez parcourir les étiquettes en les définissant sur visibles ou non en fonction de la densité souhaitée.
edit: notez que parfois matplotlib définit les étiquettes ==
''
, il peut donc sembler qu'une étiquette n'est pas présente, alors qu'en fait elle n'affiche rien. Pour vous assurer que vous parcourez les étiquettes visibles réelles, vous pouvez essayer:la source
ax.get_xticklabels()[1::2]
sont généralement les étiquettes à cacher.''
sorte que lorsque vous les parcourez, vous faites des xticklabels qui sont vides et invisibles (ce qui n'aurait aucun effet sur la visualisation, mais pourrait signifier que vous ne tirez pas les bonnes étiquettes). Vous pouvez essayer:vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
C'est un vieux sujet, mais je tombe dessus de temps en temps et j'ai fait cette fonction. C'est très pratique:
Une mise en garde de contrôler les tiques comme ceci est que l'on ne profite plus de la mise à jour automagique interactive de l'échelle maximale après une ligne ajoutée. Alors fais
et exécutez à nouveau la fonction de réajustement.
la source
J'ai développé une solution inélégante. Considérez que nous avons l'axe X et également une liste d'étiquettes pour chaque point dans X.
Exemple: Disons que je veux afficher les étiquettes des ticks uniquement pour 'feb' et 'jun' Bon, maintenant nous avons une fausse liste d'étiquettes. Tout d'abord, nous avons tracé la version originale. Maintenant, la version modifiée.la source
si vous voulez juste définir l'espacement d'une simple doublure avec un passe-partout minimal:
fonctionne également facilement pour les tiques mineures:
un peu plein, mais assez compact
la source
Cela a fonctionné pour moi
si vous voulez des ticks entre [1,5] (1 et 5 inclus) alors remplacez
la source
xmarks = range(1, length+1, 1)
. à peu près sûr que la compréhension de la liste est redondante.Implémentation Pure Python
Ci-dessous, une implémentation en python pur de la fonctionnalité souhaitée qui gère toute série numérique (int ou float) avec des valeurs positives, négatives ou mixtes et permet à l'utilisateur de spécifier la taille d'étape souhaitée:
Exemple de sortie
Exemple d'utilisation
Notez que l'axe des x a des valeurs entières toutes espacées de façon égale par 5, tandis que l'axe des y a un intervalle différent (le
matplotlib
comportement par défaut, car les graduations n'étaient pas spécifiées).la source