Traccia due istogrammi allo stesso tempo con matplotlib

Ho creato un grafico dell’istogramma utilizzando i dati di un file e nessun problema. Ora volevo sovrapporre i dati di un altro file nello stesso istogramma, quindi faccio qualcosa di simile

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

ma il problema è che per ogni intervallo appare solo la barra con il valore più alto e l’altra è nascosta. Mi chiedo come sia ansible tracciare entrambi gli istogrammi contemporaneamente con colors diversi.

Qui hai un esempio funzionante:

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

inserisci la descrizione dell'immagine qui

Le risposte accettate forniscono il codice per un istogramma con barre sovrapposte, ma nel caso in cui si desideri che ciascuna barra sia affiancata (come ho fatto io), prova la seguente variante:

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

inserisci la descrizione dell'immagine qui

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

EDIT [2018/03/16]: aggiornato per consentire il tracciamento di array di dimensioni diverse, come suggerito da @stochastic_zeitgeist

Nel caso in cui si abbiano diverse dimensioni del campione, potrebbe essere difficile confrontare le distribuzioni con un singolo asse y. Per esempio:

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

hist_single_ax

In questo caso, puoi tracciare i tuoi due set di dati su diversi assi. Per fare ciò, è ansible ottenere i dati dell’istogramma usando Matplotlib, cancellare l’asse e quindi ri-tracciare su due assi separati (spostando i bordi del raccoglitore in modo che non si sovrappongano):

 #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() 

hist_twin_ax

Ecco un semplice metodo per tracciare due istogrammi, con le barre affiancate, sullo stesso grafico quando i dati hanno dimensioni diverse:

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

Nel caso in cui hai panda ( import pandas as pd ) o stai bene con l’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() 

Dovresti usare i valori di ritorno dei bins di hist:

 import numpy as np import matplotlib.pyplot as plt foo = np.random.normal(loc=1, size=100) # a normal distribution bar = np.random.normal(loc=-1, size=10000) # a normal distribution _, bins, _ = plt.hist(foo, bins=50, range=[-6, 6], normed=True) _ = plt.hist(bar, bins=bins, alpha=0.5, normed=True) 

Due istogrammi matplotlib con lo stesso binning