J'ai une figure matplotlib que je trace des données qui sont toujours appelées nanosecondes (1e-9). Sur l'axe des y, si j'ai des données qui sont des dizaines de nanosecondes, c'est à dire. 44e-9, la valeur sur l'axe indique 4,4 avec un + 1e-8 comme décalage. Est-il possible de forcer l'axe à afficher 44 avec un décalage de + 1e-9?
Il en va de même pour mon axe des x où l'axe montre + 5,54478e4, où je préférerais qu'il affiche un décalage de +55447 (nombre entier, pas de décimale - la valeur ici est en jours).
J'ai essayé quelques trucs comme ça:
p = axes.plot(x,y)
p.ticklabel_format(style='plain')
pour l'axe des x, mais cela ne fonctionne pas, bien que je l'utilise probablement de manière incorrecte ou que j'interprète mal quelque chose de la documentation, quelqu'un peut-il me diriger dans la bonne direction?
Merci, Jonathan
J'ai essayé de faire quelque chose avec les formateurs mais je n'ai pas encore trouvé de solution ...:
myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)
et
myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)
Sur une note latérale, je suis en fait confus quant à l'endroit où l'objet 'offset number' réside réellement ... fait-il partie des graduations majeures / mineures?
la source
set_units
? matplotlib.sourceforge.net/api/… (Je ne peux pas l'essayer car je n'ai pas matplotlib ici.)rcParams
de désactiver si désactivé par défaut:rcParams["axes.formatter.useoffset"] = False
comme ici: stackoverflow.com/questions/24171064/…Réponses:
J'ai eu exactement le même problème, et ces lignes ont résolu le problème:
la source
ax.get_yaxis().get_major_formatter().set_useOffset(False)
from matplotlib.ticker import ScalarFormatter
code de @Gonzalo fonctionne ou utilisez simplement la solution deUne solution beaucoup plus simple consiste simplement à personnaliser les étiquettes de graduation. Prenons cet exemple:
Remarquez comment dans le cas de l'axe y, j'ai multiplié les valeurs par
1e9
puis mentionné cette constante dans l'étiquette yÉDITER
Une autre option consiste à simuler le multiplicateur d'exposant en ajoutant manuellement son texte en haut du graphique:
EDIT2
Vous pouvez également formater la valeur de décalage de l'axe x de la même manière:
la source
Vous devez sous-classer
ScalarFormatter
pour faire ce dont vous avez besoin ..._set_offset
ajoute simplement une constante que vous voulez définirScalarFormatter.orderOfMagnitude
. Malheureusement, la configuration manuelleorderOfMagnitude
ne fera rien, car elle est réinitialisée lorsque l'ScalarFormatter
instance est appelée pour formater les étiquettes de graduation des axes. Cela ne devrait pas être si compliqué, mais je ne trouve pas de moyen plus simple de faire exactement ce que vous voulez ... Voici un exemple:Ce qui donne quelque chose comme:
Alors que la mise en forme par défaut ressemblerait à:
J'espère que ça aidera un peu!
Edit: Pour ce que ça vaut, je ne sais pas non plus où se trouve l'étiquette offset ... Ce serait un peu plus facile de la définir manuellement, mais je ne savais pas comment le faire ... J'ai le sentiment qu'il doit y avoir un moyen plus simple que tout cela. Cela fonctionne, cependant!
la source
Similaire à la réponse d'Amro, vous pouvez utiliser FuncFormatter
la source
La solution de Gonzalo a commencé à fonctionner pour moi après avoir ajouté
set_scientific(False)
:la source
Comme cela a été souligné dans les commentaires et dans cette réponse , le décalage peut être désactivé globalement, en procédant comme suit:
la source
Je pense qu'une manière plus élégante est d'utiliser le formateur de ticker. Voici un exemple pour xaxis et yaxis:
la source
Pour la deuxième partie, sans réinitialiser manuellement tous les ticks, c'était ma solution:
évidemment, vous pouvez définir la chaîne de format sur ce que vous voulez.
la source