Tengo una parcela existente que se creó con los pandas como este:

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

El eje y en formato flotante y quiero cambiar el eje y de los porcentajes. Todas las soluciones que he encontrado uso ax.xyz de la sintaxis y sólo puedo colocar el código debajo de la línea que crea la trama (no puedo agregar ax=ax a la línea de arriba.)

¿Cómo puedo dar formato al eje y como porcentajes sin cambiar la línea de arriba?

Aquí está la solución que he encontrado pero requiere que redefinir 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()

Link a la solución anterior: Pyplot: el uso de porcentaje en el eje x,

InformationsquelleAutor Chris | 2015-07-11

5 Comentarios

  1. 65

    Este es un par de meses de retraso, pero he creado PR#6251 con matplotlib para agregar un nuevo PercentFormatter clase. Con esta clase sólo se necesita una línea para cambiar el formato de su eje (dos si contamos 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, xmax, decimals, symbol. xmax permite establecer el valor que corresponde al 100% en el eje. Esto es bueno si usted tiene datos de 0.0 a 1.0 y desea mostrar es de 0% a 100%. Acaba de hacer PercentFormatter(1.0).

    Los otros dos parámetros permiten establecer el número de dígitos después del punto decimal y el símbolo. El valor predeterminado None y '%', respectivamente. decimals=None se establecerá automáticamente el número de puntos decimales basado en la cantidad de los ejes, se están mostrando.

    Actualización

    PercentFormatter fue introducido en Matplotlib adecuada en la versión 2.1.0.

    • No puedo esperar para el lanzamiento. Me preguntaba por un tiempo ¿por qué esto no es trivial. Gracias por la adición de este.
    • El PR fue aceptado en la versión 2.1. No estoy seguro al que está programado para el lanzamiento, pero probablemente en los próximos meses. En tanto, usted puede utilizar siempre la versión de GitHub.
    • Este es el derecho respuesta, pero un año más tarde, todavía estamos a la espera de matplotlib 2.1…
    • Tengo una tendencia a utilizar la versión directamente desde el git. Hace la vida más fácil.
    • Gracias por esto! Se ha fusionado y liberado ahora, y yo sólo lo utiliza 🙂
    • Hola! Gracias – grandes cosas! La nomenclatura de los max param parece haberse convertido en xmax, tal vez vale la pena una actualización.
    • Buena llamada. Hecho
    • Esto es genial! Podría usted por favor, edite la respuesta para indicar que es ahora una característica de matplotlib? La vinculación a la PR sugiere que no se combinarán. Esto debe ser aceptado respuesta.
    • href=»https://stackoverflow.com/questions/31357611/format-y-axis-as-percent/36319915?noredirect=1#comment60815087_36319915″ title=»el formato del eje y como el por ciento»>stackoverflow.com/questions/31357611/format-y-axis-as-percent/…
    • Gracias por la petición
    • Sí vi ese comentario, y que ahora se fusionaron, pero sería bueno dejar claro en la respuesta misma de la OMI.
    • Justo lo suficiente. He actualizado. Yo estaba pensando en stackoverflow.com/a/36320013/2988730 (enchufe descarado)

  2. 117

    pandas dataframe parcela devolverá el ax para usted, Y entonces usted puede comenzar a manipular los ejes de 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])

    Formato de eje y como porcentaje

    • Esto va a tener efectos no deseados tan pronto como pan/zoom de la gráfica de forma interactiva
    • Millones de veces más fácil que intentar usar matplotlib.ticker función de los formateadores!
    • ¿Cómo se puede limitar el eje y decir (0,100%)? Traté de ax.set_ylim(0,100) pero que no se parecen a la obra!!
    • sólo las etiquetas de los yticks se cambian, por lo que los límites están todavía en unidades naturales. Configuración de ax.set_ylim(0, 1) hará el truco.
  3. 69

    Jianxun‘s solución hicimos el trabajo para mí, pero se rompió el valor y el indicador en la parte inferior izquierda de la ventana.

    Terminé usando FuncFormatterlugar (y también despojó a la uneccessary ceros finales 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))) 

    Generalmente hablando, me gustaría recomendar el uso de FuncFormatter para la etiqueta de formato: es fiable y versátil.

    Formato de eje y como porcentaje

    • Puede simplificar el código aún más: ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format)). AKA no hay necesidad para el lambda, vamos a formato de hacer el trabajo.
    • puede usted explicar esto un poco? Particularmente dentro de las { }. No está seguro de cómo mi 0.06 se convirtió en un 6% el uso de que con el python formato. También gran solución. Parece mucho más fiable que el de uso .set_ticklabels
    • crea un formato de función. El 0 antes de los dos puntos indica el formateador para reemplazar las llaves y su contenido con el primer argumento pasado a la función. La parte después de los dos puntos, .0%, dice el formateador de cómo se representa el valor. El .0 especifica 0 decimales y % especifica la representación como un porcentaje.
  4. 27

    Para aquellos que están buscando para el quick one-liner:

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

    O si usted está usando de Látex como el eje sobre el formateador de texto, deberá añadir una barra invertida ‘\’

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

    Propongo un método alternativo utilizando 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)

    Formato de eje y como porcentaje

Dejar respuesta

Please enter your comment!
Please enter your name here