Гистограмма Matplotlib
Итак, у меня есть небольшая проблема. У меня есть набор данных в scipy, который уже находится в формате гистограммы, поэтому у меня есть центр бункеров и количество событий в ящике. Как я могу теперь построить график как гистограмму. Я пробовал просто делать
bins, n=hist()
но это не понравилось. Любые рекомендации?
Ответы
Ответ 1
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()
![enter image description here]()
Объектно-ориентированный интерфейс также прост:
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()
![введите описание изображения здесь]()
Ответ 2
Если вы не хотите баров, вы можете построить его так:
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()
![histogram]()
Ответ 3
Я знаю, что это не отвечает на ваш вопрос, но я всегда останавливаюсь на этой странице, когда я ищу решение matplotlib для гистограмм, потому что простой histogram_demo
был удален со страницы галереи примера matplotlib.
Вот решение, которое не требует импорта numpy
. Я импортирую только NUMPY для генерации данных x
для построения графика. Он опирается на функцию hist
вместо функции bar
, как в ответе @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')
![enter image description here]()
Также ознакомьтесь с галереей matplotlib и примерами matplotlib.
Ответ 4
Если вы хотите использовать pandas
:
pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')
Ответ 5
Я думаю, что это может быть полезно для кого-то.
Функция гистограммы Numpy, к моему раздражению (хотя, я считаю, есть веская причина для этого), возвращает назад края каждого бункера, а не значение бина. Хотя это имеет смысл для чисел с плавающей запятой, которые могут лежать в пределах интервала (т.е. Центральное значение не имеет большого значения), это не желаемый результат при работе с дискретными значениями или целыми числами (0, 1, 2 и т.д.), В частности, длина бинов, возвращаемых из np.histogram, не равна длине отсчетов/плотности.
Чтобы обойти это, я использовал np.digitize для квантования ввода и возврата дискретного количества ящиков вместе с долей подсчетов для каждого бина. Вы можете легко редактировать, чтобы получить целое число count.
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
Ответ 6
Лучший способ сделать это:
x.hist(y, 20)
Предполагается, что x - это имя любых данных, которые вы хотите внести в гистограмму, y - столбец данных, который вы хотите сделать данными (в матрице), а 20 - количество бункеров, которые вы хотите в вашей гистограмме.
Я нахожу этот метод проще и короче, чем большинство других. Надеюсь, это поможет!