¿Cómo trazar un gráfico de barras superpuestas utilizando matplotlib en python?

Quiero trazar un gráfico de barras o un histogtwig usando matplotlib. No quiero un gráfico de barras astackdas, sino un gráfico de barras superpuestas de dos listas de datos, por ejemplo, tengo las siguientes dos listas de datos conmigo:

Algún código para empezar:

import matplotlib.pyplot as plt from numpy.random import normal, uniform highPower = [1184.53,1523.48,1521.05,1517.88,1519.88,1414.98,1419.34, 1415.13,1182.70,1165.17] lowPower = [1000.95,1233.37, 1198.97,1198.01,1214.29,1130.86,1138.70, 1104.12,1012.95,1000.36] plt.hist(highPower, bins=10, histtype='stepfilled', normed=True, color='b', label='Max Power in mW') plt.hist(lowPower, bins=10, histtype='stepfilled', normed=True, color='r', alpha=0.5, label='Min Power in mW') 

Quiero trazar estas dos listas contra el número de valores en las dos listas, de modo que pueda ver la variación por lectura.

Puede producir un gráfico de barras superpuestas utilizando plt.bar() con la palabra clave alpha como se muestra a continuación.

El alpha controla la transparencia de la barra.

NB: cuando tiene dos barras superpuestas, una con un alfa <1, obtendrá una mezcla de colores. Como tal, la barra aparecerá de color púrpura aunque la leyenda la muestre como un rojo claro. Para aliviar esto, he modificado el ancho de una de las barras, de esta forma, aunque tus poderes cambien, podrás ver ambas barras.

plt.xticks se puede usar para establecer la ubicación y el formato de las X-ticks en su gráfico.

 import matplotlib.pyplot as plt import numpy as np width = 0.8 highPower = [1184.53,1523.48,1521.05,1517.88,1519.88,1414.98, 1419.34,1415.13,1182.70,1165.17] lowPower = [1000.95,1233.37, 1198.97,1198.01,1214.29,1130.86, 1138.70,1104.12,1012.95,1000.36] indices = np.arange(len(highPower)) plt.bar(indices, highPower, width=width, color='b', label='Max Power in mW') plt.bar([i+0.25*width for i in indices], lowPower, width=0.5*width, color='r', alpha=0.5, label='Min Power in mW') plt.xticks(indices+width/2., ['T{}'.format(i) for i in range(len(highPower))] ) plt.legend() plt.show() 

Trama

Sobre la base de la respuesta de @Ffisegydd, si sus datos están en un Marco de datos de Pandas, esto debería funcionar bien:

 def overlapped_bar(df, show=False, width=0.9, alpha=.5, title='', xlabel='', ylabel='', **plot_kwargs): """Like a stacked bar chart except bars on top of each other with transparency""" xlabel = xlabel or df.index.name N = len(df) M = len(df.columns) indices = np.arange(N) colors = ['steelblue', 'firebrick', 'darksage', 'goldenrod', 'gray'] * int(M / 5. + 1) for i, label, color in zip(range(M), df.columns, colors): kwargs = plot_kwargs kwargs.update({'color': color, 'label': label}) plt.bar(indices, df[label], width=width, alpha=alpha if i else 1, **kwargs) plt.xticks(indices + .5 * width, ['{}'.format(idx) for idx in df.index.values]) plt.legend() plt.title(title) plt.xlabel(xlabel) if show: plt.show() return plt.gcf() 

Y luego en una línea de comando de python:

 low = [1000.95, 1233.37, 1198.97, 1198.01, 1214.29, 1130.86, 1138.70, 1104.12, 1012.95, 1000.36] high = [1184.53, 1523.48, 1521.05, 1517.88, 1519.88, 1414.98, 1419.34, 1415.13, 1182.70, 1165.17] df = pd.DataFrame(np.matrix([high, low]).T, columns=['High', 'Low'], index=pd.Index(['T%s' %i for i in range(len(high))], name='Index')) overlapped_bar(df, show=False) 

gráfico de barras superpuestas en matplotlib