# python – Plot two histograms on single chart with matplotlib

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

Here you have a working example:

``````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()
`````` 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 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()
`````` EDIT [2018/03/16]: Updated to allow plotting of arrays of different sizes, as suggested by @stochastic_zeitgeist

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

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 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()
`````` 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 dont overlap):

``````#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 - bins) * 0.4
bins_shifted = bins + width
ax1.bar(bins[:-1], n, width, align=edge, color=colors)
ax2.bar(bins_shifted[:-1], n, width, align=edge, color=colors)

#finishes the plot
ax1.set_ylabel(Count, color=colors)
ax2.set_ylabel(Count, color=colors)
ax1.tick_params(y, colors=colors)
ax2.tick_params(y, colors=colors)
plt.tight_layout()
plt.show()
`````` 