그래서 약간의 문제가 있습니다. 이미 히스토그램 형식 인 scipy에 데이터 세트가 있으므로 빈의 중심과 빈당 이벤트 수를 가지고 있습니다. 이제 플롯을 히스토그램으로 표시 할 수 있습니다. 난 그냥 해봤 어
bins, n=hist()
그러나 그것은 그것을 좋아하지 않았습니다. 권장 사항이 있습니까?
그래서 약간의 문제가 있습니다. 이미 히스토그램 형식 인 scipy에 데이터 세트가 있으므로 빈의 중심과 빈당 이벤트 수를 가지고 있습니다. 이제 플롯을 히스토그램으로 표시 할 수 있습니다. 난 그냥 해봤 어
bins, n=hist()
그러나 그것은 그것을 좋아하지 않았습니다. 권장 사항이 있습니까?
답변:
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")
사용자 정의 (비상 수) Bin을 사용하는 경우를 사용하여 너비 계산을 np.diff
전달하고, 너비를 로 전달하고 ax.bar
, 사용 ax.set_xticks
하여 bin 가장자리에 레이블을 지정할 수 있습니다 .
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
의 width
매개 변수는 스칼라 대신 배열과 같은 객체를 허용 할 수 있습니다. 따라서 width = np.diff(bins)
대신 사용할 수 있습니다 width = 0.7 * (bins[1] - bins[0])
.
width
설정 자체는 바의 너비 만 설정합니다. x 축 레이블에 대해 이야기하고 있습니다 (즉, x 축의 레이블이되는 실제 빈 가장자리를보고 싶습니다). plt.hist
작동 방식 과 비슷해야 합니다.
ax.set_xticks
를 설정하는 데 사용할 수 있습니다 . 내가 의미하는 바를 보여주기 위해 위의 예를 추가했습니다.
막대를 원하지 않는 경우 다음과 같이 플로팅 할 수 있습니다.
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()
ax.step
.
이것이 귀하의 질문에 대한 답이 아니라는 것을 알고 있지만 histogram_demo
, matplotlib 예제 갤러리 페이지에서 단순 항목 이 제거 되었기 때문에 히스토그램에 대한 matplotlib 솔루션을 검색 할 때 항상이 페이지로 이동 합니다.
다음은 numpy
가져올 필요가없는 솔루션 입니다. x
플로팅 할 데이터 를 생성하기 위해 numpy 만 가져옵니다 . @unutbu 의 답변 에서와 같이 함수 hist
대신 함수에 의존합니다 .bar
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')
pandas
하려는 경우 해당 사이트에 대한 링크와 진행 상황을 설명하는 자세한 예제를 포함해야합니다.
누군가에게 유용 할 것이라고 생각합니다.
Numpy의 히스토그램 기능은 귀찮게도 (그럴만 한 이유가 있음에도 불구하고) 빈의 값이 아닌 각 빈의 가장자리를 반환합니다. 이는 간격 내에있을 수있는 부동 소수점 숫자 (즉, 중앙 값이 매우 의미가 없음)에 대해 의미가 있지만 이산 값 또는 정수 (0, 1, 2 등)를 처리 할 때 원하는 출력이 아닙니다. . 특히 np.histogram에서 반환 된 빈의 길이는 개수 / 밀도의 길이와 동일하지 않습니다.
이 문제를 해결하기 위해 np.digitize를 사용하여 입력을 양자화하고 각 빈에 대한 개수의 비율과 함께 이산 빈 수를 반환했습니다. 정수 개수를 얻기 위해 쉽게 편집 할 수 있습니다.
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