2015-05-09 15 views
11

Tôi muốn vẽ một ước lượng mật độ hạt nhân 2D. Tôi thấy gói seaborn rất hữu ích ở đây. Tuy nhiên, sau khi tìm kiếm một thời gian dài, tôi không thể tìm ra cách làm cho trục y và trục x không trong suốt. Ngoài ra, làm thế nào để hiển thị các giá trị của mật độ trên đường bao? Tôi sẽ rất cảm kích nếu ai đó có thể giúp tôi. Dưới đây xin vui lòng xem mã và đồ thị của tôi. enter image description hereLập kế hoạch mật độ hạt nhân 2D với Python

import numpy as np 
import seaborn as sns 
import matplotlib.pyplot as pl 

Y = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) 
ax = sns.kdeplot(Y, shade = True, cmap = "PuBu") 
ax.patch.set_facecolor('white') 
ax.collections[0].set_alpha(0) 
ax.set_xlabel('$Y_1$', fontsize = 15) 
ax.set_ylabel('$Y_0$', fontsize = 15) 
pl.xlim(-3, 3) 
pl.ylim(-3, 3) 
pl.plot([-3, 3], [-3, 3], color = "black", linewidth = 1) 
pl.show() 
+1

Tôi không chắc chắn ý của bạn là gì "làm cho trục y và trục x không trong suốt"; dòng 'ax.collections [0] .set_alpha (0)' là làm cho đường bao thấp nhất trong suốt; nếu bạn không muốn điều đó, đừng bao gồm dòng đó. – mwaskom

Trả lời

29

Dưới đây là một giải pháp sử dụng scipymatplotlib chỉ:

import numpy as np 
import matplotlib.pyplot as pl 
import scipy.stats as st 

data = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100) 
x = data[:, 0] 
y = data[:, 1] 
xmin, xmax = -3, 3 
ymin, ymax = -3, 3 

# Peform the kernel density estimate 
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] 
positions = np.vstack([xx.ravel(), yy.ravel()]) 
values = np.vstack([x, y]) 
kernel = st.gaussian_kde(values) 
f = np.reshape(kernel(positions).T, xx.shape) 

fig = pl.figure() 
ax = fig.gca() 
ax.set_xlim(xmin, xmax) 
ax.set_ylim(ymin, ymax) 
# Contourf plot 
cfset = ax.contourf(xx, yy, f, cmap='Blues') 
## Or kernel density estimate plot instead of the contourf plot 
#ax.imshow(np.rot90(f), cmap='Blues', extent=[xmin, xmax, ymin, ymax]) 
# Contour plot 
cset = ax.contour(xx, yy, f, colors='k') 
# Label plot 
ax.clabel(cset, inline=1, fontsize=10) 
ax.set_xlabel('Y1') 
ax.set_ylabel('Y0') 

pl.show() 

Đoạn mã trên sẽ cho kết quả sau:

plot_kernel_density.jpg

trong đó có một phi trong suốt trục x, một tổ chức phi trục y -transparent và các giá trị của mật độ trên đường bao. Đây có phải là kết quả mong đợi không?

+0

Điều này rất hữu ích! Cảm ơn cho các cuộc biểu tình chi tiết. Tôi sẽ sử dụng những gì bạn đã làm ở đây. – user3698176

Các vấn đề liên quan