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.

Eres traductor de español que se encarga de traducir documentos de tecnología de la información. A continuación, te muestro la traducción al español de “pyqtgraph stacked bar graph”: Gráfico de barras apiladas de pyqtgraph.

Tengo este conjunto de datos:

import pandas as pd

df = pd.DataFrame({'x': ['A', 'B', 'C', 'D'],
                   'y1': [10, 20, 10, 30],
                   'y2': [20, 25, 15, 25],
                   'y3': [5, 10, 5, 20]})
df = df.set_index('x')
   y1  y2  y3
x
A  10  20   5
B  20  25  10
C  10  15   5
D  30  25  20

Quiero dibujar un gráfico de barras apiladas en pyqtgraph similar a este, dibujado en matplotlib:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

bottom = np.zeros(len(df))
for col in df.columns:
    ax.bar(df.index, df[col], bottom = bottom, label = col)
    bottom += df[col]

ax.legend(frameon = True)

plt.show()

Imagen

He revisado la documentación de pyqtgraph.BarGraphItem, pero no encontré información sobre cómo apilar barras.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, pyqtgraph.BarGraphItem no tiene soporte incorporado para gráficos de barras apiladas. Sin embargo, todavía podemos lograr un resultado similar utilizando varios objetos BarGraphItem y calculando manualmente las posiciones inferiores de cada barra.

    Aquí hay un ejemplo de código que muestra este enfoque:

    import pyqtgraph as pg
    import numpy as np
    
    data = np.array([[10, 20, 5], [20, 25, 10], [10, 15, 5], [30, 25, 20]])
    xlabels = ['A', 'B', 'C', 'D']
    colors = ['r', 'g', 'b']
    
    # Calcular posiciones inferiores de cada barra
    bottoms = np.cumsum(np.vstack((np.zeros(len(data[0])), data[:-1])), axis=0)
    
    # Crear objetos BarGraphItem
    bars = [pg.BarGraphItem(left=xlabels, height=data[:, i], 
                            width=0.5, brush=pg.mkBrush(colors[i]))
            for i in range(len(colors))]
    
    # Agregar barras al gráfico
    plot = pg.plot()
    for i, bar in enumerate(bars):
        bar.setOpts(bottom=bottoms[:, i])
        plot.addItem(bar)
    
    # Agregar leyenda
    legend = pg.LegendItem(offset=(70, 30))
    for i, color in enumerate(colors):
        legend.addItem(bar, str(i+1), pg.mkPen(color), brush=pg.mkBrush(color))
    plot.addItem(legend)
    
    # Establecer etiquetas de ejes
    plot.setLabel('left', 'Valor')
    plot.setLabel('bottom', 'Categoría')
    
    # Mostrar gráfico
    pg.QtGui.QApplication.exec_()
    

    Este código produce un gráfico de barras apiladas que se ve así:

    Gráfico de barras apiladas en pyqtgraph

    Tenga en cuenta que este enfoque requiere el cálculo manual de las posiciones inferiores de cada barra y puede ser un poco tedioso al tratar con datos más complejos. Si necesita crear muchos gráficos de barras apiladas, podría considerar escribir una función auxiliar o crear una subclase de BarGraphItem para agregar funcionalidad de apilamiento.

Comments are closed.