Phần này giải thích cách xây dựng biểu đồ mật độ 2D hoặc biểu đồ 2D với Python. Các loại biểu đồ cho phép trực quan hóa phân phối kết hợp của hai biến định lượng. Chúng có thể được xây dựng với Matplotlib
hoặc Seaborn
.
Biểu đồ mật độ 2D là gì?
Có một số loại biểu đồ cho phép trực quan hóa phân phối kết hợp 2 biến số. Chúng luôn có một biến được biểu thị trên trục X, cái còn lại trên trục y, giống như cho một biểu đồ phân tán [trái].
Sau đó, số lượng quan sát trong một khu vực cụ thể của không gian 2D được tính và biểu thị bằng một gradient màu. Hình dạng có thể thay đổi: Hexagones dẫn đến
# Extract x and y0, hình vuông trong
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
# Extract x and y1. Ước tính mật độ hạt nhân có thể được sử dụng để có được
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
# Extract x and y2 hoặc
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
# Extract x and y3
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
Gây nhầm lẫn? Truy cập dữ liệu-đến-viz để làm rõ ..
Biểu đồ đường viền với Seaborn
Biểu đồ đường viền có thể dễ dàng được xây dựng nhờ chức năng
# Extract x and y5 của Thư viện Seaborn.
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
Biểu đồ 2D với Seaborn
Xây dựng biểu đồ 2D nhờ hàm
# Extract x and y7 của thư viện
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
Seaborn
. Đừng quên chơi với đối số # Extract x and y9 để tìm giá trị đại diện cho dữ liệu tốt nhất của bạn.
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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
Biểu đồ hexbin với Matplotlib
Tách diện tích đồ thị thành hình lục giác và bạn nhận được biểu đồ mật độ hexbin. Lần này, đó là
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]
1 giúp bạn được bảo hiểm nhờ vào chức năng 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]
2 của nó.Biểu đồ mật độ 2D với Matplotlib
Mật độ 2D được tính toán nhờ hàm
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]
4 và được vẽ cảm ơn với chức năng 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]
5 của 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]
6.Mật độ 2D và lô cận biên
Mật độ 2D thường kết hợp với phân phối cận biên. Nó giúp làm nổi bật phân phối của cả hai biến riêng lẻ. Thật là đơn giản để thêm nhờ vào chức năng
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]
7 của thư viện Seaborn
. Cách trực quan hóa phân phối chung
Bài đăng này sẽ chỉ cho bạn cách để:
- Sử dụng hạt nhân Gaussian để ước tính PDF của 2 bản phân phối
- Sử dụng matplotlib để biểu diễn pdf với các đường viền được dán nhãn xung quanh các ô mật độ
- Cách trích xuất các đường viền
- Cách vẽ trong 3D Hạt nhân Gaussian ở trên
- Cách sử dụng biểu đồ 2D để vẽ cùng một pdf
Hãy bắt đầu bằng cách tạo một bộ dữ liệu đầu vào bao gồm 3 đốm:
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as st
from sklearn.datasets.samples_generator import make_blobsn_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"];
Để phù hợp với hạt nhân Gaussian, chúng tôi chỉ định một Meshgrid sẽ sử dụng nội suy 100 điểm trên mỗi trục [ví dụ: 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]# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
Chúng tôi sẽ phù hợp với một hạt nhân Gaussian bằng phương pháp SCIPY Gaussian_kde:
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]
Vẽ kernel với các đường viền chú thích
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']
Đối tượng matplotlib thực hiện toàn bộ phép thuật được gọi là bộ QuadContour [CSET trong mã]. Chúng ta có thể lập trình truy cập các dòng đường viền bằng cách lặp qua đối tượng AllSegs. Các nhãn được tính toán có thể truy cập từ LabelTexts.
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[]
Các lô KDE 3D
Chúng tôi sẽ sử dụng matplotlib từ AXES3D từ MPLOT3D. Chúng ta có thể vẽ mật độ như một bề mặt:
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]
Hoặc như một khung dây:
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'];
Đại diện sử dụng biểu đồ 2D
Một cách khác để trình bày cùng một thông tin là sử dụng biểu đồ 2D. Đặt tham số được định mức thành return false returns tần số thực tế trong khi thực sự trả về pdf.
h =plt.hist2d[x, y]
plt.colorbar[h[3]]
Toàn bộ mã có sẵn trên GitHub.