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
Parece que tal vez solo quieras un gráfico de barras:
- http://matplotlib.sourceforge.net/examples/pylab_examples/bar_stacked.html
- http://matplotlib.sourceforge.net/examples/pylab_examples/barchart_demo.html
Alternativamente, puede usar subtramas.