Changer l'échelle des axes X dans matplotlib

93

J'ai créé ce tracé en utilisant Matlab

entrez la description de l'image ici

En utilisant matplotlib, les x-axies dessinent de grands nombres tels que 100000, 200000, 300000. Je voudrais avoir quelque chose comme 1, 2, 3 et un 10 ^ 5 pour indiquer qu'il s'agit en fait de 100000, 200000, 300000.

Existe-t-il un moyen simple de créer une telle échelle dans matplotlib?

Aigle
la source

Réponses:

145

Essayez d'utiliser matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Cela applique la notation scientifique (c'est a x 10^b-à- dire ) à vos graduations sur l'axe des x

Chris
la source
9
est-il possible d'ajouter un décalage? (par exemple au lieu de 0,0, 0,5, 1,0, 1,5, ... et x 10 ^ b, ce sera 0, 5, 10, 15, ... et x 10 ^ {b-1})
Eagle
24
ticklabel_formatest également une méthode pour les objets axes, vous pouvez essayer quelque chose commeax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich
Comment cela peut-il fonctionner si vous avez une sous-parcelle de, disons, 2 parcelles?
FaCoffee
2
@Eagle désolé, votre question de suivi sur l'ajout d'un décalage était celle dont je parlais. mon axe x est [0.1, 0.2, ...]et je préférerais [1, 2, ...]avec un exposant ajusté. avez-vous pu trouver une solution à cela?
trianta2
@Eagle Je suis également intéressé par la question que trianta2 a mentionnée
Ben Usman
15

Ce n'est pas tant une réponse à votre question initiale qu'à l'une des questions que vous aviez dans le corps de votre question.

Un petit préambule, pour que mon nom ne semble pas étrange:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Comme cela a été mentionné, vous pouvez utiliser ticklabel_format pour spécifier que matplotlib doit utiliser la notation scientifique pour les valeurs grandes ou petites:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Vous pouvez modifier la façon dont cela s'affiche en utilisant les indicateurs dans rcParams (à partir de matplotlib import rcParams) ou en les définissant directement. Je n'ai pas trouvé de moyen plus élégant de changer entre la notation scientifique '1e' et 'x10 ^' que:

ax.xaxis.major.formatter._useMathText = True

Cela devrait vous donner une apparence plus Matlab-esc, et sans doute meilleure. Je pense que ce qui suit devrait faire de même:

rc('text', usetex=True)
Weir_Doe
la source
11

Le formateur scalaire prend en charge la collecte des exposants. Les documents sont les suivants:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Bases: matplotlib.ticker.Formatter

L'emplacement de la coche est un vieux numéro ordinaire. Si useOffset == True et que la plage de données est beaucoup plus petite que la moyenne des données, alors un décalage sera déterminé de sorte que les étiquettes de graduation soient significatives. La notation scientifique est utilisée pour les données <10 ^ -n ou les données> = 10 ^ m, où n et m sont les limites de puissance définies à l'aide de set_powerlimits ((n, m)). Les valeurs par défaut de celles-ci sont contrôlées par le paramètre rc axes.formatter.limits.

votre technique serait:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

Pour afficher l'exposant au format x10^5, instanciez le ScalarFormatter avec useMathText=True.

Après l'image

Vous pouvez également utiliser:

xfmt.set_useOffset(10000)

Pour obtenir un résultat comme celui-ci:

entrez la description de l'image ici

Carl F.
la source
3
Instanciez le ScalarFormatter avec useMathText=Truepour obtenir x10^4.
Jusqu'à Hoffmann
9

Je trouve la solution simple

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Cunzhang
la source