Отображение 3 гистограмм на 1 оси четким способом - matplotlib

Я создал 3 набора данных, которые организованы в массивы numpy. Я заинтересован в построении распределения вероятности этих трех наборов данных как нормированных гистограмм. Все три распределения должны выглядеть почти одинаковыми, поэтому представляется разумным построить все три на одной оси для удобства сравнения.

По умолчанию гистограммы matplotlib строятся как полосы, что делает изображение, которое я хочу, выглядит очень грязным. Следовательно, мой вопрос заключается в том, можно ли заставить pyplot.hist рисовать только квадрат/круг/треугольник, где верхняя часть панели будет в форме по умолчанию, поэтому я могу чисто отобразить все три распределения на одном графике или же я должны вычислять данные гистограммы, а затем строить ее отдельно как график рассеяния.

Спасибо заранее.

Ответ 1

Существует два способа создания трех гистограмм одновременно, но оба они не то, о чем вы просили. Чтобы выполнить то, что вы просите, вы должны вычислить гистограмму, например. используя numpy.histogram, затем построим с использованием метода plot. Используйте scatter, только если вы хотите связать другую информацию с вашими точками, установив размер для каждой точки.

Первый альтернативный подход к использованию hist включает передачу всех трех наборов данных одновременно методу hist. Затем метод hist настраивает ширину и места размещения каждого столбца так, чтобы все три набора были четко представлены.

Второй альтернативой является использование опции histtype='step', которая дает четкие графики для каждого набора.

Вот script, демонстрирующий это:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(101)
a = np.random.normal(size=1000)
b = np.random.normal(size=1000)
c = np.random.normal(size=1000)

common_params = dict(bins=20, 
                     range=(-5, 5), 
                     normed=True)

plt.subplots_adjust(hspace=.4)
plt.subplot(311)
plt.title('Default')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)
plt.subplot(312)
plt.title('Skinny shift - 3 at a time')
plt.hist((a, b, c), **common_params)
plt.subplot(313)
common_params['histtype'] = 'step'
plt.title('With steps')
plt.hist(a, **common_params)
plt.hist(b, **common_params)
plt.hist(c, **common_params)

plt.savefig('3hist.png')
plt.show()

И вот результат:

enter image description here

Помните, что вы могли бы сделать все это с помощью объектно-ориентированного интерфейса, например, создавать отдельные подзаголовки и т.д.