import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()
Объектно-ориентированный интерфейс также прост:
fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")
Если вы используете настраиваемые (непостоянные) ячейки, вы можете передать вычисление ширины using np.diff
, передать ширину ax.bar
и использовать ax.set_xticks
для обозначения краев ячейки:
import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2
fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")
plt.show()
plt.bar
«swidth
параметр может принять массив-подобный объект (вместо скаляра). Таким образом, вы можете использоватьwidth = np.diff(bins)
вместоwidth = 0.7 * (bins[1] - bins[0])
.width
настройка сама по себе устанавливает только ширину полосы, верно? Я говорю о метках оси x (то есть я хочу, чтобы фактические края бункера были метками на оси x). Это должно быть похоже на то, какplt.hist
работает.ax.set_xticks
для установки xlabels. Я добавил пример выше, чтобы показать, что я имею в виду.Если вам не нужны бары, вы можете построить это так:
источник
ax.step
.Я знаю, что это не отвечает на ваш вопрос, но я всегда оказываюсь на этой странице, когда ищу решение matplotlib для гистограмм, потому что простое решение
histogram_demo
было удалено со страницы галереи примеров matplotlib.Вот решение, которое не нужно
numpy
импортировать. Я импортирую numpy только для генерации данныхx
для построения графика. Он полагается на функциюhist
вместо функции,bar
как в ответе @unutbu.Также проверьте Matplotlib галереи и примеры Matplotlib .
источник
Если вы хотите использовать
pandas
:источник
pandas
вам, вероятно, следует включить ссылку на их сайт и более подробный пример, объясняющий, что происходит.Думаю, это может быть кому-то полезно.
Функция гистограммы Numpy, к моему раздражению (хотя, я понимаю, что для этого есть веская причина), возвращает обратно края каждого бина, а не его значение. Хотя это имеет смысл для чисел с плавающей запятой, которые могут находиться в пределах интервала (т. Е. Центральное значение не имеет особого смысла), это не желаемый результат при работе с дискретными значениями или целыми числами (0, 1, 2 и т. Д.) . В частности, длина бинов, возвращаемых из np.histogram, не равна длине отсчетов / плотности.
Чтобы обойти это, я использовал np.digitize для квантования ввода и возврата дискретного количества ячеек вместе с долей отсчетов для каждого ящика. Вы можете легко отредактировать, чтобы получить целое число отсчетов.
Ссылки:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html
источник