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 trazar y anotar barras agrupadas

Tengo el siguiente código:

import numpy as np
import matplotlib.pyplot as plt

oct_data = [10, 24, 25, 30]
nov_data = [12, 42, 21, 78]

labels = ['Cuenta1', 'Cuenta2', 'Cuenta3', 'Cuenta4']
ancho_barra = 0.4

rect1 = np.arange(0, len(oct_data)*2 ,2)
rect2 = [x + ancho_barra for x in rect_1]

plt.bar(rect1, oct_data, color='#7f6d5f', width=ancho_barra, edgecolor='white', label='Mes1')
plt.bar(rect2, nov_data, color='#557f2d', width=ancho_barra, edgecolor='white', label='Mes2')

plt.ylabel('Costo ($)', fontsize=10)

plt.legend()
plt.show()

Lo cual me da la siguiente figura:

Imagen

Como puedes ver, mis xticks (Cuenta1, Cuenta2, ...) no están centrados.
Según entiendo, este comando debería hacer el trabajo, pero no lo hace.

plt.xticks([r + ancho_barra for r in range(0, len(oct_data)*2, 2)], labels)

También me gustaría añadir el valor de la altura dentro de la barra. Normalmente, esto es lo que hago con un gráfico de “barra única”:

for i in range(len(labels)):
    plt.text(i, oct_data[i]//2, oct_data[i], ha='center', color='black')

Pero eso no funciona aquí.

Cualquier ayuda será muy apreciada. Soy un principiante total con Matplotlib.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para centrar los xticks en la barra, cambie los valores de rect_1 y rect_2 a:

    rect_1 = np.arange(len(oct_data)) - bar_width/2
    rect_2 = np.arange(len(nov_data)) + bar_width/2
    

    Esto desplazará las barras hacia la izquierda en la mitad del ancho de la barra, y hacia la derecha en la mitad del ancho de la barra, respectivamente.

    Para agregar el valor de la altura dentro de la barra, puede usar el mismo bucle for que antes, pero reemplace i con rect_1[i] y rect_2[i]:

    for i in range(len(labels)):
        plt.text(rect_1[i], oct_data[i]//2, oct_data[i], ha='center', color='black')
        plt.text(rect_2[i], nov_data[i]//2, nov_data[i], ha='center', color='black')
    

    Esto agregará el valor de la altura dentro de cada barra respectiva. La división por 2 es para posicionar el texto cerca del centro de la barra.

Comments are closed.