Mam istniejącą działkę, która została utworzona z pandami takimi jak ta:
df['myvar'].plot(kind='bar')
Oś y ma format zmiennoprzecinkowy i chcę zmienić oś y na wartości procentowe. Wszystkie rozwiązania, które znalazłem, używają składni ax.xyz i mogę umieścić kod tylko poniżej linii powyżej, która tworzy wykres (nie mogę dodać ax = ax do linii powyżej).
Jak sformatować oś y jako wartości procentowe bez zmiany powyższej linii?
Oto rozwiązanie, które znalazłem, ale wymaga ponownego zdefiniowania działki :
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as mtick
data = [8,12,15,17,18,18.5]
perc = np.linspace(0,100,len(data))
fig = plt.figure(1, (7,4))
ax = fig.add_subplot(1,1,1)
ax.plot(perc, data)
fmt = '%.0f%%' # Format you want the ticks, e.g. '40%'
xticks = mtick.FormatStrFormatter(fmt)
ax.xaxis.set_major_formatter(xticks)
plt.show()
Link do powyższego rozwiązania: Pyplot: używając procentu na osi x
python
pandas
matplotlib
plot
Chris
źródło
źródło
Odpowiedzi:
To jest kilka miesięcy później, ale utworzyłem PR # 6251 z matplotlib, aby dodać nową
PercentFormatter
klasę. W przypadku tej klasy potrzebujesz tylko jednej linii do ponownego sformatowania osi (dwóch, jeśli liczysz importmatplotlib.ticker
):PercentFormatter()
przyjmuje trzy argumenty,xmax
,decimals
,symbol
.xmax
pozwala ustawić wartość odpowiadającą 100% na osi. Jest to miłe, jeśli masz dane od 0,0 do 1,0 i chcesz wyświetlić je od 0% do 100%. Po prostu zróbPercentFormatter(1.0)
.Pozostałe dwa parametry pozwalają ustawić liczbę cyfr po przecinku i symbolu. Są one domyślnie
None
i'%'
odpowiednio.decimals=None
automatycznie ustawi liczbę miejsc dziesiętnych na podstawie liczby wyświetlanych osi.Aktualizacja
PercentFormatter
został wprowadzony do właściwej wersji Matplotlib w wersji 2.1.0.źródło
from matplotlib.ticker import mtick
i założyłem, żemtick
„moduł” został usunięty.pandas dataframe plot zwróci
ax
za ciebie, a potem możesz zacząć manipulować osiami, co chcesz.źródło
matplotlib.ticker
formatów funkcji!Rozwiązanie Jianxun wykonało zadanie za mnie, ale złamało wskaźnik wartości y w lewym dolnym rogu okna.
Skończyło się na tym, że
FuncFormatter
zamiast tego użyłem (a także usunąłem niepotrzebne zera końcowe, jak sugerowano tutaj ):Ogólnie rzecz biorąc, polecam używanie
FuncFormatter
do formatowania etykiet: jest niezawodne i wszechstronne.źródło
ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format))
. AKA nie potrzeba lambdy, niech format wykona całą pracę.'{0:.0%}'.format
tworzy funkcję formatowania .0
Dwukropek „ przed” mówi programowi formatującemu, aby zamienić nawiasy klamrowe i ich zawartość na pierwszy argument przekazany do funkcji. Część po dwukropku.0%
informuje formatera, jak wyrenderować wartość..0
Określa 0 miejsc po przecinku i%
określa, renderowania jako procent.Dla tych, którzy szukają szybkiej jednej linijki:
Lub jeśli używasz Latex jako programu formatującego tekst osi, musisz dodać jeden lewy ukośnik „\”
źródło
Proponuję alternatywną metodę wykorzystującą
seaborn
Kod roboczy:
źródło
Spóźniłem się do gry, ale po prostu zdaję sobie sprawę, że:
ax
można go zastąpićplt.gca()
dla tych, którzy nie używają osi i tylko poletek.Powtarzając odpowiedź @Mad Physicist, używając pakietu
PercentFormatter
będzie to:źródło