Vẽ đồ thị mật độ density 2D in python

Trong bài viết này tôi sẽ hướng dẫn:

Sử dụng phương pháp Gaissian kernel để ước tính PDF của 2 phân phối distributions;

Sử dụng matplotlib để vẽ phân phối PDF với các đường contour theo phân phối mật độ;

Làm thế nào để extract một contour lines

Làm thế nào để vẽ biểu đồ 3D với gaussian kernel;

Làm thế nào để sử dụng biểu đồ histograms 2D giống như PDF;

Để bắt đầu, chúng ta cần input dữ liệu trong 3 blobs sau:

#các thư viện cần import chú ý bổ sung thêm thư viện  axes3d 
 from mpl_toolkits.mplot3d import axes3d
 import numpy as np
 import matplotlib.pyplot as plt
 import scipy.stats as st
 from sklearn.datasets.samples_generator import make_blobs
 n_components = 3
 X, truth = make_blobs(n_samples=300, centers=n_components, 
                       cluster_std = [2, 1.5, 1], 
                       random_state=42)
 plt.scatter(X[:, 0], X[:, 1], s=50, c = truth)
 plt.title(f"Example of a mixture of {n_components} distributions")
 plt.xlabel("x")
 plt.ylabel("y");

#thêm dòng lệnh plt.show() để test kết quả:

Bây giờ chúng ta sẽ fitting gaussian kernel, đặc biệt ở đây chúng ta sẽ sử dụng meshgrid đế nhóm 100 điểm vào thành 1 nhóm ( ví dụ lệnh: mgrid(xmin:xmax:100j)

#Extract x and y
x = X[:, 0]
y = X[:, 1]# Define the borders
deltaX = (max(x) – min(x))/10
deltaY = (max(y) – min(y))/10xmin = min(x) – deltaX
xmax = max(x) + deltaXymin = min(y) – deltaY
ymax = max(y) + deltaYprint(xmin, xmax, ymin, ymax)

Phần trên đã khai báo đầy đủ data cho vẽ các đồ thị, tương ứng với các đồ thị ta sẽ sử dụng các lệnh sau:

  1. Vẽ đồ thị kernel với các đường contour

Create meshgrid
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 = plt.figure(figsize=(8,8))
ax = fig.gca()
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
cfset = ax.contourf(xx, yy, f, cmap=’coolwarm’)
ax.imshow(np.rot90(f), cmap=’coolwarm’, extent=[xmin, xmax, ymin, ymax])
cset = ax.contour(xx, yy, f, colors=’k’)
ax.clabel(cset, inline=1, fontsize=10)
ax.set_xlabel(‘X’)
ax.set_ylabel(‘Y’)
plt.title(‘2D Gaussian Kernel density estimation’)

  • Thư viện matplotlib làm entire toàn bộ magic được gọi là QuadContour set (cset). Chúng ta có thể lập trình truy cập các đường contour bằng cách sử dụng allsegs Object:

plt.figure(figsize=(8,8))for j in range(len(cset.allsegs)):
for ii, seg in enumerate(cset.allsegs[j]):
plt.plot(seg[:,0], seg[:,1], ‘.-‘, label=f’Cluster{j}, level{ii}’)plt.legend()

  1. 3D KDE Plots

Chúng ta sử dụng thư viện axes3d từ mplot3d để vẽ phân bố mật độ trên bề mặt 2D:

fig = plt.figure(figsize=(13, 7))
ax = plt.axes(projection=’3d’)
surf = ax.plot_surface(xx, yy, f, rstride=1, cstride=1, cmap=’coolwarm’, edgecolor=’none’)
ax.set_xlabel(‘x’)
ax.set_ylabel(‘y’)
ax.set_zlabel(‘PDF’)
ax.set_title(‘Surface plot of Gaussian 2D KDE’)
fig.colorbar(surf, shrink=0.5, aspect=5) # add color bar indicating the PDF
ax.view_init(60, 35)

  1. Hoặc hiện thị như dạng khung dây lưới wireframe:

fig = plt.figure(figsize=(13, 7))
ax = plt.axes(projection=’3d’)
w = ax.plot_wireframe(xx, yy, f)
ax.set_xlabel(‘x’)
ax.set_ylabel(‘y’)
ax.set_zlabel(‘PDF’)
ax.set_title(‘Wireframe plot of Gaussian 2D KDE’);

  1. Vẽ biểu đồ Histograms:

Một cách khác để hiện thị thông tin là sử dụng 2D histogram với tham số normed trả về tần suất giống như  PDF

h =plt.hist2d(x, y)
plt.colorbar(h[3])

By HUYHC 9/2019