Гистограмма Matplotlib
Так у меня есть небольшая проблема. У меня есть набор данных в scipy, который уже находится в формате гистограммы, поэтому у меня есть центр ячеек и количество событий на ячейку. Как я могу теперь построить график в виде гистограммы. Я пробовал просто делать
bins, n=hist()
но это не так. Какие-нибудь рекомендации?
5 ответов:
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")
если вы используете пользовательские (непостоянные) бункеры, вы можете передать вычислить ширину с помощью
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()
Если вы не хотите, баров вы можете построить его, как это:
import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) bins, edges = np.histogram(x, 50, normed=1) left,right = edges[:-1],edges[1:] X = np.array([left,right]).T.flatten() Y = np.array([bins,bins]).T.flatten() plt.plot(X,Y) plt.show()
Я знаю, что это не ответ на ваш вопрос, но я всегда оказываюсь на этой странице, когда я ищу решение matplotlib для гистограмм, потому что простой
histogram_demo
был удален со страницы галереи примеров matplotlib.вот решение, которое не требует
numpy
чтобы быть импортированы. Я только импортирую numpy для генерации данныхx
для построения графика. Он опирается на функциюhist
вместо функцииbar
как в ответ by @unutbu.import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) import matplotlib.pyplot as plt plt.hist(x, bins=50) plt.savefig('hist.png')
также проверить matplotlib галерея и примеры matplotlib.
Если вы используете
pandas
:pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
Я думаю, что это может быть полезно для кого-то.
функция гистограммы Numpy, к моему раздражению (хотя, я ценю, что для этого есть веская причина), возвращает края каждого Бина, а не значение Бина. Хотя это имеет смысл для чисел с плавающей запятой, которые могут лежать в интервале (т. е. центральное значение не является сверхзначимым), это не является желаемым выходом при работе с дискретными значениями или целыми числами (0, 1, 2 и т. д.). В частности, длина БИНС вернулся из НП.гистограмма не равна длине отсчетов / плотности.
чтобы обойти это, я использовал np.оцифровка для квантования входных данных и возврата дискретного числа ячеек вместе с долей отсчетов для каждой ячейки. Вы можете легко редактировать, чтобы получить целое число подсчетов.
def compute_PMF(data) import numpy as np from collections import Counter _, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False) h = Counter(np.digitize(data,bins) - 1) weights = np.asarray(list(h.values())) weights = weights / weights.sum() values = np.asarray(list(h.keys())) return weights, values ####
ссылки:
[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html