programing

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

lastmoon 2023. 6. 6. 10:35
반응형

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

다음을 사용하여 히스토그램을 표시하는 방법은 무엇입니까?

막대 높이에 해당하는 y 값 목록과 x 값 문자열 목록이 있습니다.

관련: .

히스토그램을 사용하려면 다음과 같은 이유로 x 값에 '이름'을 추가할 필요가 없습니다.

  • x을 가지게 됩니다.
  • y 카운트축카기트(-운값주))density=True)
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');

여기에 이미지 설명 입력

참고, 의 수bins=30임의로 선택되었으며, "올바른" 빈 너비를 선택하는 데 있어 더 과학적이어야 하는 프리드먼-디아코니스 규칙이 있습니다.

![여기에 이미지 설명 입력 어디서IQR사분위간 범위 및n 총 .

그래서, 이 규칙에 따르면, 사람들은 다음의 숫자를 계산할 수 있습니다.bins다음과 같이:

q25, q75 = np.percentile(x, [25, 75])
bin_width = 2 * (q75 - q25) * len(x) ** (-1/3)
bins = round((x.max() - x.min()) / bin_width)
print("Freedman–Diaconis number of bins:", bins)
plt.hist(x, bins=bins);

Freedman–Diaconis number of bins: 82

여기에 이미지 설명 입력

그리고 마지막으로, 당신은 당신의 히스토그램을 조금 더 화려하게 만들 수 있습니다.PDF 및: 제, 목및범:

import scipy.stats as st

plt.hist(x, density=True, bins=82, label="Data")
mn, mx = plt.xlim()
plt.xlim(mn, mx)
kde_xs = np.linspace(mn, mx, 300)
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");

여기에 이미지 설명 입력

다른 기회를 탐색할 의향이 있다면 다음과 같은 방법이 있습니다.seaborn:

# !pip install seaborn
import seaborn as sns
sns.displot(x, bins=82, kde=True);

여기에 이미지 설명 입력

이제 OP로 돌아갑니다.

데이터 점의 수가 제한된 경우에는 막대 그래프가 데이터를 나타내는 것이 더 적합합니다.그런 다음 레이블을 x축에 부착할 수 있습니다.

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

여기에 이미지 설명 입력

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

출력은 다음과 같습니다.

여기에 이미지 설명 입력

이것은 오래된 질문이지만 이전의 답변 중 어떤 것도 실제 문제를 다루지 않았습니다. 즉, 문제가 질문 자체에 있다는 사실입니다.

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

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

그러나 문제 1을 참조하십시오. 이러한 확률은 정확하지 않으며 이 경우 막대 그래프를 "히스토그램"으로 사용하는 것은 잘못된 것입니다. 왜냐하면 막대 그래프는 어떤 이유로든 일변량 분포에 대한 이야기를 나타내지 않기 때문입니다(아마도 클래스가 겹치고 관측치가 여러 번 카운트됨). 이 경우에는 막대 그래프를 히스토그램이라고 해서는 안 됩니다.

히스토그램은 정의상 일변량 변수 분포의 그래픽 표현이며(히스토그램 | NIST/SEMATECH-통계 방법 및 히스토그램 | 위키피디아핸드북 참조) 관심 변수의 선택된 클래스에서 관측치의 카운트 또는 빈도를 나타내는 크기의 막대를 그려서 생성됩니다.변수가 연속 척도로 측정되는 경우 이러한 클래스는 빈(구간)입니다.히스토그램 생성 절차의 중요한 부분은 범주형 변수에 대한 반응 범주를 그룹화(또는 그룹화하지 않고 유지)하거나 연속형 변수에 대해 가능한 값의 영역을 구간(빈 경계를 둘 위치)으로 분할하는 방법을 선택하는 것입니다.모든 관측치는 그림에 한 번만 표시되어야 합니다.즉, 막대 크기의 합이 관측치의 총 카운트(또는 변동 폭의 경우에는 덜 일반적인 접근 방식)와 같아야 합니다.또는 히스토그램이 정규화된 경우 모든 확률이 최대 1이어야 합니다.

으로서 "각 값이라면 "확률", "확률", "확률"입니다.plt.hist(probability)아마도 비닝 옵션이 있고, 이미 사용 가능한 x-binters의 사용이 의심스럽습니다.

그런 다음 막대 그림을 히스토그램으로 사용하지 않고 단순하게 사용해야 합니다.

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까지 합하지 않는다는 사실은 의미가 없습니다).

이는 매우 우회적인 방법이지만 이미 bin 값을 알고 있지만 원본 데이터가 없는 히스토그램을 만들려면np.random.randinthist 함수가 그래프로 표시할 각 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 눈금을 빈에 정렬할 수 있습니다.

#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.. ])

문제는 다음을 사용하여 히스토그램을 표시하는 것이 어려운 것 같습니다.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')

언급URL : https://stackoverflow.com/questions/33203645/how-to-plot-a-histogram-using-matplotlib-in-python-with-a-list-of-data

반응형