IT박스

matplotlib에서 밀도 플롯을 만드는 방법은 무엇입니까?

itboxs 2020. 7. 26. 12:42
반응형

matplotlib에서 밀도 플롯을 만드는 방법은 무엇입니까?


RI에서 다음을 수행하여 원하는 출력을 만들 수 있습니다.

data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
         rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))

R의 밀도 플롯

파이썬에서 (matplotlib 사용) 가장 간단한 히스토그램을 얻었습니다.

import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()

matplotlib의 히스토그램

또한 normed = True 매개 변수를 시도했지만 가우스를 히스토그램에 맞추려고 시도하는 것 외에는 아무것도 얻을 수 없었습니다.

내 최신 시도는 주위했다 scipy.statsgaussian_kde웹에 대한 예제 다음,하지만 난 지금까지 실패한 있었어요.


Sven은 gaussian_kdeScipy 에서 클래스를 사용하는 방법을 보여 주었지만 R로 생성 한 것과는 다르게 보이지 않습니다. 이는 gaussian_kde대역폭을 자동으로 추론하려고하기 때문 입니다. 클래스 의 기능 covariance_factor변경하여 대역폭을 가지고 놀 수 있습니다 gaussian_kde. 첫째, 다음은 해당 기능을 변경하지 않고 얻는 것입니다.

대체 텍스트

However, if I use the following code:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()

I get

대체 텍스트

which is pretty close to what you are getting from R. What have I done? gaussian_kde uses a changable function, covariance_factor to calculate its bandwidth. Before changing the function, the value returned by covariance_factor for this data was about .5. Lowering this lowered the bandwidth. I had to call _compute_covariance after changing that function so that all of the factors would be calculated correctly. It isn't an exact correspondence with the bw parameter from R, but hopefully it helps you get in the right direction.


Five years later, when I Google "how to create a kernel density plot using python", this thread still shows up at the top!

오늘날이 작업을 수행하는 훨씬 쉬운 방법 은 많은 편리한 플로팅 기능과 우수한 스타일 관리 기능을 제공하는 패키지 인 seaborn 을 사용 하는 것입니다.

import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)

여기에 이미지 설명을 입력하십시오


아마도 다음과 같은 것을 시도해보십시오.

import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()

gaussian_kde()다른 커널 밀도 추정값으로 쉽게 대체 할 수 있습니다 .


옵션 1:

pandas데이터 프레임 플롯 사용 (의 위에 구축 matplotlib) :

import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()

여기에 이미지 설명을 입력하십시오

옵션 2 :

사용 distplotseaborn:

import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)

여기에 이미지 설명을 입력하십시오

참고 URL : https://stackoverflow.com/questions/4150171/how-to-create-a-density-plot-in-matplotlib

반응형