Formato y eje como porcentaje

Tengo una ttwig existente que fue creada con pandas como este:

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

El eje y está formateado como flotante y quiero cambiar el eje y a porcentajes. Todas las soluciones que encontré usan la syntax ax.xyz y solo puedo colocar código debajo de la línea superior que crea el gráfico (no puedo agregar ax = ax a la línea superior).

¿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 ttwig :

 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, eg '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

El diagtwig de dataframe de pandas te devolverá el ax , y luego podrás comenzar a manipular los ejes lo que quieras.

 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]) 

introduzca la descripción de la imagen aquí

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 FuncFormatter en FuncFormatter lugar (y también eliminé los ceros finales innecesarios como se sugiere aquí ):

 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, recomiendo usar FuncFormatter para el formato de tags: es confiable y versátil.

introduzca la descripción de la imagen aquí

Esto es unos meses tarde, 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%. Sólo haz 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 están en 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.

Para aquellos que están buscando una rápida de una sola línea:

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

O si está utilizando Latex como el 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()])