데이터 목록과 함께 Python에서 Matplotlib를 사용하여 히스토그램을 그리는 방법은 무엇입니까?


100

matplotlib.hist()함수를 사용하여 히스토그램을 그리 려고하는데 어떻게해야할지 모르겠습니다.

목록이 있습니다

probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]

이름 (문자열) 목록.

확률을 각 막대의 y 값으로 만들고 이름을 x 값으로 어떻게 만드나요?

답변:


168

히스토그램을 원하면 x- 축에 데이터 빈이 있으므로 '이름'을 x- 값에 첨부 할 필요가 없습니다.

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
np.random.seed(42)
x = np.random.normal(size=1000)
plt.hist(x, density=True, bins=30)  # `density=False` would make counts
plt.ylabel('Probability')
plt.xlabel('Data');

여기에 이미지 설명 입력

PDF선, 제목 및 범례를 사용하여 히스토그램을 좀 더 멋지게 만들 수 있습니다 .

import scipy.stats as st
plt.hist(x, density=True, bins=30, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 301)
kde = st.gaussian_kde(x)
plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
plt.legend(loc="upper left")
plt.ylabel('Probability')
plt.xlabel('Data')
plt.title("Histogram");

여기에 이미지 설명 입력

그러나 OP와 같이 제한된 수의 데이터 포인트가있는 경우 막대 그래프가 데이터를 나타내는 데 더 적합합니다 (그러면 레이블을 x 축에 첨부 할 수 있음).

x = np.arange(3)
plt.bar(x, height=[1,2,3])
plt.xticks(x, ['a','b','c'])

여기에 이미지 설명 입력


4
파이썬에서 줄 끝에 세미콜론이 없다는 것을 기억하십시오!
Toad22222

10
@ Toad22222 이것은 Ipython 노트북 셀에서 발췌 한 것입니다. 세미콜론없이 실행하고 차이점을 확인하십시오. 내가 게시하는 모든 코드 스 니펫은 내 컴퓨터에서 완벽하게 실행됩니다.
Sergey Bushmanov

2
Sergey가 사용하는 세미콜론에 대해 궁금한 경우 플롯 객체에 대한 텍스트를 억제하기 위해 플로팅 할 때 Jupyter 노트북 (이전의 IPython 노트북) 셀에서 세미콜론을 사용하는 방법 은 여기# 16을 참조 하세요 .
Wayne

19

아직 matplotlib를 설치하지 않은 경우 명령을 시도하십시오.

> pip install matplotlib

도서관 가져 오기

import matplotlib.pyplot as plot

히스토그램 데이터 :

plot.hist(weightList,density=1, bins=20) 
plot.axis([50, 110, 0, 0.06]) 
#axis([xmin,xmax,ymin,ymax])
plot.xlabel('Weight')
plot.ylabel('Probability')

히스토그램 표시

plot.show()

출력은 다음과 같습니다.

여기에 이미지 설명 입력


2
plot.axis ([50, 110, 0, 0.06]) '라인은 예제에서 쓸모가 없습니다. 게다가 표시 할 플롯 영역을 하드 코딩하기 때문에 데이터가 그 안에 완전히 들어 가지 않으면 왜 제대로 표시되지 않는지 혼란 스러울 수 있습니다.
typhon04

10

질문은 히스토그램을 사용하여 플로팅을 요구하는 것처럼 보이지만 matplotlib.hist() 함수를 의 후반부는 주어진 확률을 막대의 y 값으로 사용하고 주어진 이름 (문자열)을 x- 값.

플롯을 그릴 주어진 확률에 해당하는 이름의 샘플 목록을 가정하고 있습니다. 간단한 막대 그림이 주어진 문제에 대한 목적을 제공합니다. 다음 코드를 사용할 수 있습니다.

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
names = ['name1', 'name2', 'name3', 'name4', 'name5', 'name6', 'name7', 'name8', 'name9',
'name10', 'name11', 'name12', 'name13'] #sample names
plt.bar(names, probability)
plt.xticks(names)
plt.yticks(probability) #This may be included or excluded as per need
plt.xlabel('Names')
plt.ylabel('Probability')

5

이것은 오래된 질문이지만 이전 답변 중 어느 것도 실제 문제, 즉 문제가 질문 자체에 있다는 사실을 해결하지 못했습니다.

첫째, 확률이 이미 계산 된 경우, 즉 히스토그램 집계 데이터를 정규화 된 방식으로 사용할 수있는 경우 확률은 1이되어야합니다. 분명히 그렇지 않으며 용어 나 데이터에 문제가 있음을 의미합니다. 또는 질문하는 방식으로.

둘째, 레이블이 제공된다는 사실 (구간이 아님)은 일반적으로 확률이 범주 형 반응 변수라는 것을 의미하며 막대 그래프를 사용하여 히스토그램을 그리는 것이 가장 좋습니다 (또는 플롯의 hist 방법을 해킹). Shayan Shafiq의 답변은 코드를 제공합니다.

그러나 문제 1을 참조하십시오. 이러한 확률은 정확하지 않으며이 경우 "히스토그램"으로 막대 그림을 사용하는 것은 어떤 이유로 일 변량 분포에 대한 이야기를 말하지 않기 때문에 잘못된 것입니다 (아마도 클래스가 겹치고 관측 값이 여러 번 계산 됨). 시간?)과 같은 플롯을이 경우 히스토그램이라고해서는 안됩니다.

히스토그램은 일 변량 변수의 분포를 그래픽으로 표현한 것입니다 ( https://www.itl.nist.gov/div898/handbook/eda/section3/histogra.htm 참조). , https://en.wikipedia.org/wiki 참조). / 히스토그램) 관심 변수의 선택된 클래스에서 관측치의 개수 또는 빈도를 나타내는 크기의 막대를 그려서 생성됩니다. 변수가 연속 척도로 측정되는 경우 해당 클래스는 빈 (간격)입니다. 히스토그램 생성 절차의 중요한 부분은 범주 형 변수에 대한 응답 범주를 그룹화 (또는 그룹화하지 않고 유지)하는 방법 또는 가능한 값의 도메인을 간격 (빈 경계를 넣을 위치)으로 분할하는 방법을 선택하는 것입니다. 유형 변수. 모든 관측 값은 플롯에서 한 번만 표시되어야합니다. 즉, 막대 크기의 합은 총 관측 수 (또는 가변 너비의 경우 해당 영역, 덜 일반적인 접근 방식)와 같아야합니다. 또는 히스토그램이 정규화되면 모든 확률의 합이 1이되어야합니다.

데이터 자체가 응답으로서의 "확률"목록 인 경우, 즉 관측 값이 각 연구 대상에 대한 확률 값인 경우 가장 좋은 대답은 단순히 plt.hist(probability)비닝 옵션을 사용하는 것이며 이미 사용 가능한 x- 라벨의 사용은 다음과 같습니다. 의심 많은.

그런 다음 막대 그래프를 히스토그램으로 사용해서는 안됩니다.

import matplotlib.pyplot as plt
probability = [0.3602150537634409, 0.42028985507246375, 
  0.373117033603708, 0.36813186813186816, 0.32517482517482516, 
  0.4175257731958763, 0.41025641025641024, 0.39408866995073893, 
  0.4143222506393862, 0.34, 0.391025641025641, 0.3130841121495327, 
  0.35398230088495575]
plt.hist(probability)
plt.show()

결과와 함께

여기에 이미지 설명 입력

이 경우 matplotlib는 기본적으로 다음 히스토그램 값과 함께 도착합니다.

(array([1., 1., 1., 1., 1., 2., 0., 2., 0., 4.]),
 array([0.31308411, 0.32380469, 0.33452526, 0.34524584, 0.35596641,
        0.36668698, 0.37740756, 0.38812813, 0.39884871, 0.40956928,
        0.42028986]),
 <a list of 10 Patch objects>)

결과는 배열의 튜플이고, 첫 번째 배열에는 관측 카운트가 포함됩니다. 즉, 플롯의 y 축에 대해 표시되는 항목 (총 관측 개수 13 개)이 표시되고 두 번째 배열은 x의 간격 경계입니다. -중심선.

간격이 똑같은지 확인할 수 있습니다.

x = plt.hist(probability)[1]
for left, right in zip(x[:-1], x[1:]):
  print(left, right, right-left)

여기에 이미지 설명 입력

또는 예를 들어 3 개의 빈 (내 판단에는 13 개의 관측치가 필요함)의 경우이 히스토그램이 표시됩니다.

plt.hist(probability, bins=3)

여기에 이미지 설명 입력

"막대 뒤에있는"플롯 데이터는

여기에 이미지 설명 입력

질문의 작성자는 "확률"값 목록의 의미가 무엇인지 명확히해야합니다. "확률"은 응답 변수의 이름 일뿐입니다 (그런 다음 히스토그램을위한 x- 라벨이 준비된 이유는 무엇입니까? ) 또는 데이터에서 계산 된 확률의 목록 값입니다 (그러면 합계가 1이되지 않는다는 사실은 의미가 없습니다).


4

이것은 매우 둥근 방법이지만 이미 bin 값을 알고 있지만 소스 데이터가없는 히스토그램을 만들고 싶다면 np.random.randint함수를 사용하여 각 범위 내에서 올바른 수의 값을 생성 할 수 있습니다. 그래프로 표시 할 hist 함수의 bin입니다. 예를 들면 다음과 같습니다.

import numpy as np
import matplotlib.pyplot as plt

data = [np.random.randint(0, 9, *desired y value*), np.random.randint(10, 19, *desired y value*), etc..]
plt.hist(data, histtype='stepfilled', bins=[0, 10, etc..])

레이블의 경우 x 눈금을 bin과 정렬하여 다음과 같은 결과를 얻을 수 있습니다.

#The following will align labels to the center of each bar with bin intervals of 10
plt.xticks([5, 15, etc.. ], ['Label 1', 'Label 2', etc.. ])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.