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))
파이썬에서 (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()
또한 normed = True 매개 변수를 시도했지만 가우스를 히스토그램에 맞추려고 시도하는 것 외에는 아무것도 얻을 수 없었습니다.
내 최신 시도는 주위했다 scipy.stats
및 gaussian_kde
웹에 대한 예제 다음,하지만 난 지금까지 실패한 있었어요.
Sven은 gaussian_kde
Scipy 에서 클래스를 사용하는 방법을 보여 주었지만 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 :
사용 distplot
의 seaborn
:
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
'IT박스' 카테고리의 다른 글
원격 JMX JConsole을 사용하는 사람이 있습니까? (0) | 2020.07.26 |
---|---|
boost_shared_mutex (다중 읽기 / 한 번 쓰기)의 예? (0) | 2020.07.26 |
ReactJS에서 뷰포트 / 창 높이 가져 오기 (0) | 2020.07.26 |
node_modules / rxjs / internal / types.d.ts (81,44) : 오류 TS1005 : ';' (0) | 2020.07.26 |
.data () 키 / 값을 기준으로 필터 요소 (0) | 2020.07.26 |