wake-up-neo.net

Formatieren Sie die y-Achse als Prozent

Ich habe eine vorhandene Handlung, die mit pandas wie folgt erstellt wurde:

df['myvar'].plot(kind='bar')

Die y-Achse hat das Format float und ich möchte die y-Achse in Prozent ändern. Alle gefundenen Lösungen verwenden die ax.xyz-Syntax und Ich kann Code nur unter der Zeile platzieren, über der die Zeichnung erstellt wird (Ich kann ax = ax nicht hinzufügen in die obige Zeile.)

Wie kann ich die y-Achse als Prozentsatz formatieren, ohne die obige Zeile zu ändern?

Hier ist die Lösung, die ich gefunden habe , aber ich muss die Handlung neu definieren :

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 zur obigen Lösung: Pyplot: mit Prozent auf der x-Achse

76
Chris

pandas dataframe plot gibt das ax für Sie zurück. Anschließend können Sie die Achsen nach Belieben manipulieren.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100,5))

# you get ax from here
ax = df.plot()
type(ax)  # matplotlib.axes._subplots.AxesSubplot

# manipulate
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])

enter image description here

107
Jianxun Li

Jianxun 's Lösung hat den Job für mich erledigt, aber den y-Wert-Indikator unten links im Fenster gebrochen.

Am Ende habe ich FuncFormatterinstead verwendet (und auch die nicht benötigten nachgestellten Nullen entfernt, wie vorgeschlagen hier ):

import pandas as pd
import numpy as np
from matplotlib.ticker import FuncFormatter

df = pd.DataFrame(np.random.randn(100,5))

ax = df.plot()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

Im Allgemeinen würde ich empfehlen, FuncFormatter für die Formatierung von Etiketten zu verwenden: Es ist zuverlässig und vielseitig.

enter image description here

65
erwanp

Das ist ein paar Monate zu spät, aber ich habe PR # 6251 mit matplotlib erstellt, um eine neue Klasse PercentFormatter hinzuzufügen. Mit dieser Klasse benötigen Sie nur eine Zeile, um Ihre Achse neu zu formatieren (zwei, wenn Sie den Import von matplotlib.ticker Zählen):

import ...
import matplotlib.ticker as mtick

ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())

PercentFormatter() akzeptiert drei Argumente, xmax, decimals, symbol. Mit xmax können Sie den Wert einstellen, der 100% auf der Achse entspricht. Dies ist hilfreich, wenn Sie Daten von 0,0 bis 1,0 haben und diese von 0% bis 100% anzeigen möchten. Mach einfach PercentFormatter(1.0).

Mit den beiden anderen Parametern können Sie die Anzahl der Nachkommastellen und das Symbol einstellen. Sie sind standardmäßig auf None und '%' Eingestellt. decimals=None Setzt die Anzahl der Dezimalstellen automatisch basierend auf der Anzahl der angezeigten Achsen.

53
Mad Physicist

Für diejenigen, die den schnellen Einzeiler suchen:

plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()]) 

Oder wenn Sie Latex als Achsentextformatierer verwenden, müssen Sie einen Backslash '\' hinzufügen.

plt.gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in plt.gca().get_yticks()]) 
25
np8