python绘图之三维核密度图
三维核密度图是一种直观的可视化工具,用于展示多变量数据的联合分布情况。它通过高度(密度)的变化清晰地呈现数据的聚集区域和稀疏区域,帮助分析数据中的模式、异常点以及变量之间的关系,从而为数据建模、假设检验、决策支持等提供重要依据,尤其适用于复杂数据结构的可视化和分析。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置随机种子以保证结果可复现
np.random.seed(42)
# 定义样本数量
n_samples = 1000
# 随机生成模拟数据
# 随机生成年龄数据,范围为18到64岁
age = np.random.randint(18, 65, size=n_samples)
# 随机生成BMI数据,范围为15到50
bmi = np.random.uniform(15, 50, size=n_samples)
# 随机生成医疗费用数据,假设其服从伽马分布,形状参数为10,比例参数为1000
charges = np.random.gamma(10, scale=1000, size=n_samples)
# 将生成的数据赋值给x, y, z,分别对应年龄、BMI和费用
x = age
y = bmi
z = charges
# 使用np.histogram2d计算二维直方图的核密度估计
# 参数bins=50表示将x和y的范围分别划分为50个区间
# 参数density=True表示计算的是密度而非频数
density, x_edges, y_edges = np.histogram2d(x, y, bins=50, density=True)
# 对密度值进行归一化,使其总和为1
density /= density.sum()
# 创建网格坐标,用于绘制三维曲面
# x_edges[:-1]和y_edges[:-1]分别表示x和y的区间左端点
x_grid, y_grid = np.meshgrid(x_edges[:-1], y_edges[:-1])
# 绘制三维核密度图
fig = plt.figure(figsize=(10, 8)) # 设置图形大小
ax = fig.add_subplot(111, projection='3d') # 创建三维坐标轴
# 绘制三维曲面图
# x_grid和y_grid是网格坐标,density.T是转置后的密度矩阵
# cmap='viridis'表示使用viridis颜色映射,edgecolor='none'表示不绘制边缘线
ax.plot_surface(x_grid, y_grid, density.T, cmap='viridis', edgecolor='none')
# 设置坐标轴标签
ax.set_xlabel('Age')
ax.set_ylabel('BMI')
ax.set_zlabel('Density')
# 设置图形标题
ax.set_title('3D Kernel Density Estimation')
# 显示图形
plt.show()