히스토그램 Matplotlib


107

그래서 약간의 문제가 있습니다. 이미 히스토그램 형식 인 scipy에 데이터 세트가 있으므로 빈의 중심과 빈당 이벤트 수를 가지고 있습니다. 이제 플롯을 히스토그램으로 표시 할 수 있습니다. 난 그냥 해봤 어

bins, n=hist()

그러나 그것은 그것을 좋아하지 않았습니다. 권장 사항이 있습니까?

답변:


239
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()

여기에 이미지 설명 입력


빈 가장자리를 막대 그래프의 x 축으로 전달하는 방법이 있습니까?
CMCDragonkai

@CMCDragonkai : plt.barwidth매개 변수는 스칼라 대신 배열과 같은 객체를 허용 할 수 있습니다. 따라서 width = np.diff(bins)대신 사용할 수 있습니다 width = 0.7 * (bins[1] - bins[0]).
unutbu

하지만 width설정 자체는 바의 너비 만 설정합니다. x 축 레이블에 대해 이야기하고 있습니다 (즉, x 축의 레이블이되는 실제 빈 가장자리를보고 싶습니다). plt.hist작동 방식 과 비슷해야 합니다.
CMCDragonkai

2
@CMCDragonkai : xlabels ax.set_xticks를 설정하는 데 사용할 수 있습니다 . 내가 의미하는 바를 보여주기 위해 위의 예를 추가했습니다.
unutbu

22

막대를 원하지 않는 경우 다음과 같이 플로팅 할 수 있습니다.

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()

히스토그램


6
를 사용할 수도 있습니다 ax.step.
tacaswell 2014 년

12

이것이 귀하의 질문에 대한 답이 아니라는 것을 알고 있지만 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 예제 도 확인하십시오 .


"여기에 numpy가 필요하지 않은 솔루션이 있습니다."-코드의 첫 줄이 numpy를 가져옵니다. :)
Martin R.

2
@Martin R. 플로팅 할 데이터를 생성하는 것뿐입니다. 4-6 행을 참조하십시오. numpy를 사용하지 않습니다.
tommy.carstensen

6

사용하려는 경우 pandas:

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')

27
사용을 제안 pandas하려는 경우 해당 사이트에 대한 링크와 진행 상황을 설명하는 자세한 예제를 포함해야합니다.
tacaswell 2014 년

0

누군가에게 유용 할 것이라고 생각합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.