Tengo una trama existente que se creó con pandas como este:
df['myvar'].plot(kind='bar')
El eje y tiene el 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 el gráfico (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: usando porcentaje en el eje x
python
pandas
matplotlib
plot
Chris
fuente
fuente
Respuestas:
Esto es unos meses tarde, pero he creado PR # 6251 con matplotlib para agregar una nueva
PercentFormatter
clase. Con esta clase, solo necesita una línea para reformatear su eje (dos si cuenta la importación dematplotlib.ticker
):PercentFormatter()
acepta tres argumentos,xmax
,decimals
,symbol
.xmax
le 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%. Solo hazloPercentFormatter(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.Actualizar
PercentFormatter
se introdujo en Matplotlib propiamente dicho en la versión 2.1.0.fuente
from matplotlib.ticker import mtick
y asumí que elmtick
"módulo" fue eliminado.pandas dataframe plot devolverá el
ax
por usted, y luego puede comenzar a manipular los ejes lo que quiera.fuente
matplotlib.ticker
formateadores de funciones!La solución de Jianxun hizo el trabajo por mí, pero rompió el indicador de valor y en la parte inferior izquierda de la ventana.
Terminé usando en su
FuncFormatter
lugar (y también eliminé los ceros finales innecesarios como se sugiere aquí ):En términos generales, recomendaría usarlo
FuncFormatter
para formatear etiquetas: es confiable y versátil.fuente
ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format))
. AKA no es necesario el lambda, deje que el formato haga el trabajo.'{0:.0%}'.format
crea una función de formateo . El0
antes de los dos puntos le dice al formateador que reemplace las llaves y su contenido con el primer argumento pasado a la función. La parte que sigue a los dos puntos,.0%
indica al formateador cómo representar el valor. El.0
especifica 0 lugares decimales y%
especifica la representación como porcentaje.Para aquellos que buscan una frase rápida:
O si está utilizando Latex como formateador de texto del eje, debe agregar una barra invertida '\'
fuente
Propongo un método alternativo usando
seaborn
Código de trabajo:
fuente
Llego tarde al juego, pero me doy cuenta de esto:
ax
se puede reemplazar conplt.gca()
para aquellos que no están usando ejes y solo subtramas.Haciendo eco de la respuesta de @Mad Physicist, usando el paquete
PercentFormatter
sería:fuente