tiempo real matrices graficos graficas graficar grafica coordenadas barras python matplotlib plot histogram

python - real - Trace dos histogramas al mismo tiempo con matplotlib



matplotlib python (6)

Creé una gráfica de histograma usando datos de un archivo y no hay problema. Ahora quería superponer los datos de otro archivo en el mismo histograma, así que hago algo así como

n,bins,patchs = ax.hist(mydata1,100) n,bins,patchs = ax.hist(mydata2,100)

pero el problema es que para cada intervalo, solo aparece la barra con el valor más alto y el otro está oculto. Me pregunto cómo podría trazar ambos histogramas al mismo tiempo con diferentes colores.


Aquí hay un método simple para trazar dos histogramas, con sus barras una al lado de la otra, en el mismo diagrama cuando los datos tienen diferentes tamaños:

def plotHistogram(p, o): """ p and o are iterables with the values you want to plot the histogram of """ plt.hist([p, o], color=[''g'',''r''], alpha=0.8, bins=50) plt.show()


Aquí tienes un ejemplo de trabajo:

import random import numpy from matplotlib import pyplot x = [random.gauss(3,1) for _ in range(400)] y = [random.gauss(4,2) for _ in range(400)] bins = numpy.linspace(-10, 10, 100) pyplot.hist(x, bins, alpha=0.5, label=''x'') pyplot.hist(y, bins, alpha=0.5, label=''y'') pyplot.legend(loc=''upper right'') pyplot.show()


En caso de que tengas pandas ( import pandas as pd ) o estás de acuerdo con su uso:

test = pd.DataFrame([[random.gauss(3,1) for _ in range(400)], [random.gauss(4,2) for _ in range(400)]]) plt.hist(test.values.T) plt.show()


En el caso de que tenga diferentes tamaños de muestra, puede ser difícil comparar las distribuciones con un solo eje y. Por ejemplo:

import numpy as np import matplotlib.pyplot as plt #makes the data y1 = np.random.normal(-2, 2, 1000) y2 = np.random.normal(2, 2, 5000) colors = [''b'',''g''] #plots the histogram fig, ax1 = plt.subplots() ax1.hist([y1,y2],color=colors) ax1.set_xlim(-10,10) ax1.set_ylabel("Count") plt.tight_layout() plt.show()

En este caso, puede trazar sus dos conjuntos de datos en diferentes ejes. Para hacerlo, puede obtener los datos de su histograma usando matplotlib, borrar el eje y luego volver a trazarlo en dos ejes separados (desplazando los bordes del contenedor para que no se superpongan):

#sets up the axis and gets histogram data fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.hist([y1, y2], color=colors) n, bins, patches = ax1.hist([y1,y2]) ax1.cla() #clear the axis #plots the histogram data width = (bins[1] - bins[0]) * 0.4 bins_shifted = bins + width ax1.bar(bins[:-1], n[0], width, align=''edge'', color=colors[0]) ax2.bar(bins_shifted[:-1], n[1], width, align=''edge'', color=colors[1]) #finishes the plot ax1.set_ylabel("Count", color=colors[0]) ax2.set_ylabel("Count", color=colors[1]) ax1.tick_params(''y'', colors=colors[0]) ax2.tick_params(''y'', colors=colors[1]) plt.tight_layout() plt.show()


Las respuestas aceptadas dan el código para un histograma con barras superpuestas, pero en el caso de que quiera que cada barra sea una al lado de la otra (como yo lo hice), intente la siguiente variación:

import numpy as np import matplotlib.pyplot as plt plt.style.use(''seaborn-deep'') x = np.random.normal(1, 2, 5000) y = np.random.normal(-1, 3, 2000) bins = np.linspace(-10, 10, 30) plt.hist([x, y], bins, label=[''x'', ''y'']) plt.legend(loc=''upper right'') plt.show()

Referencia: http://matplotlib.org/examples/statistics/histogram_demo_multihist.html

EDIT [2018/03/16]: actualizado para permitir el trazado de matrices de diferentes tamaños, como lo sugiere @stochastic_zeitgeist