web-dev-qa-db-fra.com

Changer l'échelle des axes x dans matplotlib

J'ai créé cette parcelle en utilisant Matlab

enter image description here

En utilisant matplotlib, x-axies dessine de grands nombres tels que 100000, 200000, 300000. J'aimerais avoir quelque chose comme 1, 2, 3 et un 10 ^ 5 pour indiquer qu’il s’agit en réalité de 100000, 200000, 300000.

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

80
Eagle

Essayez d'utiliser matplotlib.pyplot.ticklabel_format :

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

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

127
Chris

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 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 les petites valeurs:

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

Vous pouvez modifier son affichage à l'aide des indicateurs de rcParams (provenant de 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 ^' par rapport à:

ax.xaxis.major.formatter._useMathText = True

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

rc('text', usetex=True)
14
Weir_Doe

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

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

Emplacement de la tique est un ancien numéro plaine. Si useOffset == True et que la plage de données est beaucoup plus petite que la moyenne des données, un décalage sera déterminé de manière à ce que les libellés de coches soient significatifs. 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:

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

Pour que l'exposant soit affiché au format x10^5, instanciez le ScalarFormatter avec useMathText=True.

After Image

Vous pouvez aussi utiliser:

xfmt.set_useOffset(10000)

Pour obtenir un résultat comme celui-ci:

enter image description here

11
Carl F.

Je trouve la solution simple

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