Le tracé de deux histogrammes qui se chevauchent (ou plus) peut conduire à un tracé plutôt encombré. Je trouve que l'utilisation de histogrammes en escalier (alias histogrammes creux) améliore considérablement la lisibilité. Le seul inconvénient est que dans matplotlib, la légende par défaut d'un histogramme en escalier n'est pas correctement formatée, elle peut donc être modifiée comme dans l'exemple suivant :
import numpy as np # v 1.19.2
import matplotlib.pyplot as plt # v 3.3.2
from matplotlib.lines import Line2D
rng = np.random.default_rng(seed=123)
# Create two normally distributed random variables of different sizes
# and with different shapes
data1 = rng.normal(loc=30, scale=10, size=500)
data2 = rng.normal(loc=50, scale=10, size=1000)
# Create figure with 'step' type of histogram to improve plot readability
fig, ax = plt.subplots(figsize=(9,5))
ax.hist([data1, data2], bins=15, histtype='step', linewidth=2,
alpha=0.7, label=['data1','data2'])
# Edit legend to get lines as legend keys instead of the default polygons
# and sort the legend entries in alphanumeric order
handles, labels = ax.get_legend_handles_labels()
leg_entries = {}
for h, label in zip(handles, labels):
leg_entries[label] = Line2D([0], [0], color=h.get_facecolor()[:-1],
alpha=h.get_alpha(), lw=h.get_linewidth())
labels_sorted, lines = zip(*sorted(leg_entries.items()))
ax.legend(lines, labels_sorted, frameon=False)
# Remove spines
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Add annotations
plt.ylabel('Frequency', labelpad=15)
plt.title('Matplotlib step histogram', fontsize=14, pad=20)
plt.show()
Comme vous pouvez le voir, le résultat est assez propre. Ceci est particulièrement utile lorsque l'on superpose plus de deux histogrammes. Selon la façon dont les variables sont distribuées, cela peut fonctionner jusqu'à environ 5 distributions superposées. Au-delà, il faudrait utiliser un autre type de graphique, comme celui présenté ci-dessous. ici .