pyplot python pandas matplotlib plot

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