103 votes

Changer l'échelle des axes x dans matplotlib

J'ai créé ce graphique en utilisant Matlab

enter image description here

En utilisant matplotlib, les axes x dessinent de grands nombres tels que 100000, 200000, 300000. J'aimerais avoir quelque chose comme 1, 2, 3 et un 10^5 pour indiquer que c'est en fait 100000, 200000, 300000.

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

158voto

Chris Points 12438

Essayez d'utiliser matplotlib.pyplot.ticklabel_format :

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

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

18voto

Weir_Doe Points 513

Il ne s'agit pas tant d'une réponse à votre question initiale que d'une réponse à l'une des questions que vous avez posées dans le corps de votre question.

Un petit préambule, pour que mon appellation ne paraisse 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 grandes ou petites valeurs :

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

Vous pouvez affecter la manière dont cela est affiché en utilisant les drapeaux dans rcParams (from matplotlib import rcParams) ou en les définissant directement. Je n'ai pas trouvé de moyen plus élégant de passer de la notation scientifique '1e' à 'x10^' :

ax.xaxis.major.formatter._useMathText = True

Cela devrait vous donner un aspect plus Matlab-esc, et en fait une meilleure apparence. Je pense que ce qui suit devrait faire la même chose :

rc('text', usetex=True)

11voto

Carl F. Points 2459

En formateur de scalaires soutient la collecte des exposants. Les documents sont les suivants :

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

Tick location est un simple numéro. Si useOffset==True et que l'intervalle de données données est beaucoup plus petite que la moyenne des données, alors un décalage sera déterminé de manière à ce que les étiquettes des tics 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_power. les limites de puissance définies en utilisant set_powerlimits((n,m)). Les valeurs par défaut pour sont contrôlés par le paramètre axes.formatter.limits rc.

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 obtenir l'exposant affiché au format x10^5 instancier le ScalarFormatter avec useMathText=True .

After Image

Vous pourriez aussi utiliser :

xfmt.set_useOffset(10000)

Pour obtenir un résultat comme celui-ci :

enter image description here

8voto

cunzhang Points 157

Je trouve la solution simple

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X