Zmień skalę osi x w matplotlib

95

Stworzyłem tę fabułę za pomocą Matlab

wprowadź opis obrazu tutaj

Używając matplotlib, oś x rysuje duże liczby, takie jak 100000, 200000, 300000. Chciałbym mieć wartości takie jak 1, 2, 3 i 10 ^ 5, aby wskazać, że to w rzeczywistości 100000, 200000, 300000.

Czy istnieje prosty sposób na utworzenie takiej skali w matplotlib?

Orzeł
źródło

Odpowiedzi:

147

Spróbuj użyć matplotlib.pyplot.ticklabel_format:

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

Dotyczy to notacji naukowej (tj. a x 10^b) Do znaczników osi X.

Chris
źródło
9
czy można dodać przesunięcie? (np. zamiast 0,0, 0,5, 1,0, 1,5, ... i x 10 ^ b to będzie 0, 5, 10, 15, ... i x 10 ^ {b-1})
Eagle
24
ticklabel_formatjest również metodą na obiekty osi, możesz spróbować czegoś takiego jakax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Covich
Jak to działa, jeśli masz poletek składający się, powiedzmy, z 2 działek?
FaCoffee,
2
@Eagle przepraszam, odnosiłem się do twojego pytania uzupełniającego dotyczącego dodawania przesunięcia. moja oś x jest [0.1, 0.2, ...]i wolałbym [1, 2, ...]z dopasowanym wykładnikiem. czy udało Ci się znaleźć na to rozwiązanie?
trianta2
@Eagle Interesuje mnie również pytanie, o którym mówiła trianta2
Ben Usman,
15

Jest to nie tyle odpowiedź na Twoje pierwotne pytanie, ile na jedno z pytań, które zadałeś w treści swojego pytania.

Mała preambuła, aby moje nazewnictwo nie wydawało się dziwne:

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

Jak już wspomniano, możesz użyć ticklabel_format, aby określić, że matplotlib powinien używać notacji naukowej dla dużych lub małych wartości:

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

Możesz wpłynąć na sposób, w jaki jest to wyświetlane, używając flag w rcParams (z matplotlib import rcParams) lub ustawiając je bezpośrednio. Nie znalazłem bardziej eleganckiego sposobu zmiany notacji naukowej między „1e” a „x10 ^” niż:

ax.xaxis.major.formatter._useMathText = True

To powinno dać ci więcej Matlab-esc i prawdopodobnie lepszy wygląd. Myślę, że to samo powinno zrobić:

rc('text', usetex=True)
Weir_Doe
źródło
11

W skalarne formater podpory zbieranie wykładniki. Dokumenty są następujące:

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

Lokalizacja znacznika to zwykły stary numer. Jeśli useOffset == True, a zakres danych jest znacznie mniejszy niż średnia danych, wówczas zostanie określone przesunięcie w taki sposób, aby etykiety znaczników były znaczące. Notacja naukowa jest używana dla danych <10 ^ -n lub data> = 10 ^ m, gdzie n i m to ograniczenia mocy ustawione za pomocą set_powerlimits ((n, m)). Ich wartości domyślne są kontrolowane przez parametr rc axes.formatter.limits.

twoja technika byłaby:

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)

Aby wykładnik był wyświetlany w formacie x10^5, utwórz wystąpienie ScalarFormatter z useMathText=True.

Po obrazie

Możesz również użyć:

xfmt.set_useOffset(10000)

Aby uzyskać taki wynik:

wprowadź opis obrazu tutaj

Carl F.
źródło
3
Utwórz wystąpienie ScalarFormatter z, useMathText=Trueaby uzyskać x10^4.
Till Hoffmann
9

Znajduję proste rozwiązanie

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
cunzhang
źródło