python - pyplot - Formato y eje como porcentaje
python pyplot title (5)
Tengo una trama existente que se creó con pandas como este:
df[''myvar''].plot(kind=''bar'')
El eje y tiene formato flotante y quiero cambiar el eje y a porcentajes. Todas las soluciones que encontré usan la sintaxis ax.xyz y solo puedo colocar el código debajo de la línea de arriba que crea la gráfica (no puedo agregar ax = ax a la línea de arriba).
¿Cómo puedo formatear el eje y como porcentajes sin cambiar la línea de arriba?
Aquí está la solución que encontré pero requiere que redefina la trama :
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()
Enlace a la solución anterior: Pyplot: uso de porcentaje en el eje x
Esto lleva unos meses de retraso, pero he creado
PR#6251
con matplotlib para agregar una nueva clase
PercentFormatter
.
Con esta clase solo necesita una línea para reformatear su eje (dos si cuenta la importación de
matplotlib.ticker
):
import ...
import matplotlib.ticker as mtick
ax = df[''myvar''].plot(kind=''bar'')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
PercentFormatter()
acepta tres argumentos,
max
,
decimals
,
symbol
.
max
permite establecer el valor que corresponde al 100% en el eje.
Esto es bueno si tiene datos de 0.0 a 1.0 y desea mostrarlos de 0% a 100%.
Simplemente haga
PercentFormatter(1.0)
.
Los otros dos parámetros le permiten establecer el número de dígitos después del punto decimal y el símbolo.
Por defecto son
None
y
''%''
, respectivamente.
decimals=None
establecerá automáticamente el número de puntos decimales en función de la cantidad de ejes que está mostrando.
La solución de hizo el trabajo por mí, pero rompió el indicador de valor y en la parte inferior izquierda de la ventana.
Terminé usando
FuncFormatter
en
FuncFormatter
lugar (y también eliminé los ceros finales innecesarios como se sugiere
here
):
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)))
En términos generales, recomendaría usar
FuncFormatter
para el formato de etiquetas: es confiable y versátil.
Para aquellos que buscan la línea rápida rápida:
plt.gca().set_yticklabels([''{:.0f}%''.format(x*100) for x in plt.gca().get_yticks()])
O si está utilizando Latex como formateador de texto del eje, debe agregar una barra invertida ''/'
plt.gca().set_yticklabels([''{:.0f}/%''.format(x*100) for x in plt.gca().get_yticks()])
Propongo un método alternativo usando
seaborn
Código de trabajo:
import pandas as pd
import seaborn as sns
data=np.random.rand(10,2)*100
df = pd.DataFrame(data, columns=[''A'', ''B''])
ax= sns.lineplot(data=df, markers= True)
ax.set(xlabel=''xlabel'', ylabel=''ylabel'', title=''title'')
#changing ylables ticks
y_value=[''{:,.2f}''.format(x) + ''%'' for x in ax.get_yticks()]
ax.set_yticklabels(y_value)
el diagrama de marco de datos de pandas le devolverá el
ax
, y luego puede comenzar a manipular los ejes lo que quiera.
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])