tiempo real matrices lineas hacer graficos graficas graficar dibujar coordenadas como python charts matplotlib stacked

real - graficas en python matplotlib



Gráfico de barras apiladas con colores ordenados de forma diferente con matplotlib (2)

Soy un principiante de pitón. Estoy tratando de hacer una tabla 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 cuando los presento en mi caso.

Usando datos como el anterior, quiero hacer un gráfico de barras apiladas 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 usando Matplotlib con el conjunto de datos como el anterior de una manera más automática. También quiero agregar una leyenda a la tabla si es posible.

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


Es un programa largo, pero funciona, agregué una información ficticia para distinguir el recuento de filas y el recuento 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 resultante es:


>>> 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