es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear y anotar un gráfico de barras proporcionales apiladas

Estoy teniendo dificultades para crear un gráfico de barras apiladas a partir de value_counts() de las columnas de un dataframe.

Supongamos un dataframe como el siguiente, donde responder no es importante, pero me gustaría apilar el conteo de [1,2,3,4,5] para todas las columnas q#.

responder, q1, q2, q3, q4, q5
r1, 5, 3, 2, 4, 1
r2, 3, 5, 1, 4, 2
r3, 2, 1, 3, 4, 5
r4, 1, 4, 5, 3, 2
r5, 1, 2, 5, 3, 4
r6, 2, 3, 4, 5, 1
r7, 4, 3, 2, 1, 5

Algo parecido a esto, pero cada barra estaría etiquetada por q# e incluiría 5 secciones para el recuento de [1,2,3,4,5] de los datos:

Descripción de la imagen

Idealmente, todas las barras tendrán un ancho de “100%”, mostrando el recuento como una proporción de la barra. Sin embargo, está garantizado que cada fila de responder tendrá una entrada para cada uno, por lo que el porcentaje es solo un extra si es posible.

Cualquier ayuda sería muy apreciada, con una ligera preferencia por una solución con matplotlib.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear un gráfico de barras apiladas derivado de value_counts(), puedes seguir los siguientes pasos:

    1. Primero, debes importar las bibliotecas necesarias de pandas y matplotlib:
      import pandas as pd
      import matplotlib.pyplot as plt
      
    2. A continuación, debes leer los datos en un DataFrame de pandas:
      df = pd.read_csv('data.csv')
      
    3. Luego, debes utilizar el método value_counts() para obtener el conteo de cada valor en cada columna:
      counts = pd.DataFrame({col: df[col].value_counts().sort_index() for col in df.columns[1:]})
      
    4. Para trazar el gráfico de barras apiladas, debes utilizar el método plot.bar() con el parámetro stacked=True:
      counts.plot.bar(stacked=True)
      
    5. Finalmente, para agregar anotaciones al gráfico para mostrar el conteo de cada valor en cada columna, puedes utilizar un bucle para recorrer las columnas y los valores:
      for col in counts.columns:
          for i, val in enumerate(counts[col]):
              plt.annotate(str(val), xy=(i, val), ha='center', va='bottom')
      

    El código completo se vería algo así:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv('data.csv')
    
    counts = pd.DataFrame({col: df[col].value_counts().sort_index() for col in df.columns[1:]})
    
    counts.plot.bar(stacked=True)
    
    for col in counts.columns:
        for i, val in enumerate(counts[col]):
            plt.annotate(str(val), xy=(i, val), ha='center', va='bottom')
    
    plt.show()
    

    Esto debería producir un gráfico de barras apiladas similar al mostrado en la imagen, con cada barra etiquetada por q# e incluyendo 5 secciones para el conteo de [1,2,3,4,5] de los datos.

Comments are closed.