Gráfico de barras astackdas con colores ordenados de forma diferente utilizando matplotlib

Soy un principiante de python. Estoy tratando de hacer un gráfico de barras horizontal con colores ordenados de manera diferente.

Tengo un conjunto de datos como el de abajo:

dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, {'A':34, 'B':68, 'C':32, 'D':38}, {'A':35, 'B':45, 'C':66, 'D':50}, {'A':23, 'B':23, 'C':21, 'D':16}] data_orders = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['A', 'B', 'D', 'C'], ['B', 'A', 'C', 'D']] 

La primera lista contiene datos numéricos, y la segunda contiene el orden de cada elemento de datos. Necesito la segunda lista aquí, porque el orden de A, B, C y D es crucial para el conjunto de datos al presentarlos en mi caso.

Usando datos como el anterior, quiero hacer un gráfico de barras astackdas como la imagen de abajo. Fue hecho con MS Excel por mí manualmente. Lo que espero hacer ahora es hacer este tipo de gráfico de barras utilizando Matplotlib con el conjunto de datos como el anterior de una manera más automática. También quiero agregar una leyenda al gráfico si es posible.

Gráfico de barras apiladas con colores ordenados de manera diferente (un ejemplo)

En realidad, me he perdido totalmente al intentar esto solo. Cualquier ayuda será muy, muy útil. ¡Muchas gracias por su atención!

Es un progtwig largo, pero funciona, agregué datos ficticios para distinguir el conteo de filas y el conteo de columnas:

 import numpy as np from matplotlib import pyplot as plt dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, {'A':34, 'B':68, 'C':32, 'D':38}, {'A':35, 'B':45, 'C':66, 'D':50}, {'A':23, 'B':23, 'C':21, 'D':16}, {'A':35, 'B':45, 'C':66, 'D':50}] data_orders = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['A', 'B', 'D', 'C'], ['B', 'A', 'C', 'D'], ['A', 'B', 'C', 'D']] colors = ["r","g","b","y"] names = sorted(dataset[0].keys()) values = np.array([[data[name] for name in order] for data,order in zip(dataset, data_orders)]) lefts = np.insert(np.cumsum(values, axis=1),0,0, axis=1)[:, :-1] orders = np.array(data_orders) bottoms = np.arange(len(data_orders)) for name, color in zip(names, colors): idx = np.where(orders == name) value = values[idx] left = lefts[idx] plt.bar(left=left, height=0.8, width=value, bottom=bottoms, color=color, orientation="horizontal", label=name) plt.yticks(bottoms+0.4, ["data %d" % (t+1) for t in bottoms]) plt.legend(loc="best", bbox_to_anchor=(1.0, 1.00)) plt.subplots_adjust(right=0.85) plt.show() 

La cifra del resultado es:

introduzca la descripción de la imagen aquí

 >>> dataset = [{'A':19, 'B':39, 'C':61, 'D':70}, {'A':34, 'B':68, 'C':32, 'D':38}, {'A':35, 'B':45, 'C':66, 'D':50}, {'A':23, 'B':23, 'C':21, 'D':16}] >>> data_orders = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['A', 'B', 'D', 'C'], ['B', 'A', 'C', 'D']] >>> for i,x in enumerate(data_orders): for y in x: #do something here with dataset[i][y] in matplotlib