Отображение 3 гистограмм на 1 оси в разборчивом виде - matplotlib - PullRequest
13 голосов
/ 29 февраля 2012

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

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

Заранее спасибо.

1 Ответ

21 голосов
/ 29 февраля 2012

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...