Plot two histograms on single chart with matplotlib Plot two histograms on single chart with matplotlib python python

Plot two histograms on single chart with matplotlib

Here you have a working example:

import randomimport numpyfrom matplotlib import pyplotx = [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')

enter image description here

The accepted answers gives the code for a histogram with overlapping bars, but in case you want each bar to be side-by-side (as I did), try the variation below:

import numpy as npimport matplotlib.pyplot as'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')

enter image description here


EDIT [2018/03/16]: Updated to allow plotting of arrays of different sizes, as suggested by @stochastic_zeitgeist

In the case you have different sample sizes, it may be difficult to compare the distributions with a single y-axis. For example:

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


In this case, you can plot your two data sets on different axes. To do so, you can get your histogram data using matplotlib, clear the axis, and then re-plot it on two separate axes (shifting the bin edges so that they don't overlap):

#sets up the axis and gets histogram datafig, 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 datawidth = (bins[1] - bins[0]) * 0.4bins_shifted = bins +[:-1], n[0], width, align='edge', color=colors[0])[:-1], n[1], width, align='edge', color=colors[1])#finishes the plotax1.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()