Cambia la scala degli assi x in matplotlib


93

Ho creato questa trama usando Matlab

inserisci qui la descrizione dell'immagine

Usando matplotlib, x-axies disegna grandi numeri come 100000, 200000, 300000. Vorrei avere qualcosa come 1, 2, 3 e 10 ^ 5 per indicare che è effettivamente 100000, 200000, 300000.

C'è un modo semplice per creare tale scala in matplotlib?

Risposte:


145

Prova a usare matplotlib.pyplot.ticklabel_format:

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

Questo applica la notazione scientifica (cioè a x 10^b) ai segni di graduazione dell'asse x


9
è possibile aggiungere un offset? (ad es. invece di 0,0, 0,5, 1,0, 1,5, ... e x 10 ^ b sarà 0, 5, 10, 15, ... e x 10 ^ {b-1})
Eagle

24
ticklabel_formatè anche un metodo per gli oggetti degli assi, puoi provare qualcosa comeax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich

Come può funzionare se hai una sottotrama di, diciamo, 2 trame?
FaCoffee

2
@ Eagle mi dispiace, la tua domanda di follow-up sull'aggiunta di un offset era ciò a cui mi riferivo. il mio asse x è [0.1, 0.2, ...]e preferirei [1, 2, ...]con un esponente regolato. sei riuscito a trovare una soluzione per questo?
trianta2

@Eagle Sono anche interessato alla domanda citata da trianta2
Ben Usman

15

Questa non è tanto una risposta alla tua domanda originale quanto a una delle domande che avevi nel corpo della tua domanda.

Un piccolo preambolo, in modo che il mio nome non sembri strano:

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

Come è stato accennato, puoi usare ticklabel_format per specificare che matplotlib dovrebbe usare la notazione scientifica per valori grandi o piccoli:

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

È possibile modificare il modo in cui viene visualizzato utilizzando i flag in rcParams (da matplotlib import rcParams) o impostandoli direttamente. Non ho trovato un modo più elegante per passare dalla notazione scientifica "1e" a "x10 ^" di:

ax.xaxis.major.formatter._useMathText = True

Questo dovrebbe darti più Matlab-esc e, in effetti, probabilmente un aspetto migliore. Penso che quanto segue dovrebbe fare lo stesso:

rc('text', usetex=True)

11

Il formattatore scalare supporta la raccolta degli esponenti. I documenti sono i seguenti:

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

La posizione del segno di spunta è un vecchio numero semplice. Se useOffset == True e l'intervallo di dati è molto più piccolo della media dei dati, verrà determinato un offset in modo tale che le etichette di graduazione siano significative. La notazione scientifica viene utilizzata per i dati <10 ^ -n o dati> = 10 ^ m, dove n e m sono i limiti di potenza impostati utilizzando set_powerlimits ((n, m)). I valori predefiniti per questi sono controllati dal parametro axes.formatter.limits rc.

la tua tecnica sarebbe:

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)

Per ottenere l'esponente visualizzato nel formato x10^5, creare un'istanza di ScalarFormatter con useMathText=True.

Dopo l'immagine

Potresti anche usare:

xfmt.set_useOffset(10000)

Per ottenere un risultato come questo:

inserisci qui la descrizione dell'immagine


3
Crea un'istanza di ScalarFormatter con useMathText=Trueper ottenere x10^4.
Fino a Hoffmann

9

Trovo la soluzione semplice

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.