Hướng dẫn 2d density plot python - Python âm mưu mật độ 2d


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 y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
0, hình vuông trong
# Extract x and y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
1. Ước tính mật độ hạt nhân có thể được sử dụng để có được
# Extract x and y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
2 hoặc
# Extract x and y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
3

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 y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
5 của Thư viện Seaborn.

Biểu đồ 2D với Seaborn

Xây dựng biểu đồ 2D nhờ hàm

# Extract x and y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
7 của thư viện Seaborn. Đừng quên chơi với đối số
# Extract x and y
x = X[:, 0]
y = X[:, 1]
# Define the borders
deltaX = (max(x) - min(x))/10
deltaY = (max(y) - min(y))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(xmin, xmax, ymin, ymax)# Create meshgrid
xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
9 để tìm giá trị đại diện cho dữ liệu tốt nhất của bạn.

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_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");

Để 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))/10
xmin = min(x) - deltaX
xmax = max(x) + deltaX
ymin = min(y) - deltaY
ymax = max(y) + deltaY
print(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.