如何用Matplotlib制作带光晕散点图并展示高斯潜空间不确定性
如何用Matplotlib绘制带光晕效果的散点图(展示高斯潜空间不确定性)
嘿,我来帮你解决这个问题!Matplotlib确实没有专门的「光晕效果」API,但我们可以用一些小技巧来模拟出你想要的效果,完美展示高斯潜空间的不确定性。下面给你两种实用的方法:
方法一:多层半透明散点模拟光晕
这种方法通过生成不同层级的样本点,用透明度和尺寸的差异来营造光晕感,直观体现高斯分布的扩散范围:
首先导入需要的库:
import matplotlib.pyplot as plt import numpy as np
然后模拟你的高斯随机变量参数,这里我准备了几个示例:
# 定义多个高斯分布的参数:(均值x, 均值y, x标准差, y标准差, 相关系数) gaussian_params = [ (2, 3, 0.5, 0.8, 0.3), (-1, 1, 0.7, 0.4, -0.5), (0, -2, 0.6, 0.6, 0.0) ]
接下来绘制光晕散点图:
plt.figure(figsize=(8, 6)) for mu_x, mu_y, sigma_x, sigma_y, rho in gaussian_params: # 构建协方差矩阵 cov_matrix = [[sigma_x**2, rho*sigma_x*sigma_y], [rho*sigma_x*sigma_y, sigma_y**2]] # 外层光晕:大量样本点,低透明度,大尺寸 outer_samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 1000) plt.scatter(outer_samples[:, 0], outer_samples[:, 1], s=50, alpha=0.05, color='royalblue') # 中层过渡:中等数量样本,中等透明度和尺寸 mid_samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 200) plt.scatter(mid_samples[:, 0], mid_samples[:, 1], s=20, alpha=0.2, color='royalblue') # 中心均值点:高透明度,突出标记,明确分布中心 plt.scatter(mu_x, mu_y, s=100, alpha=1, color='darkblue', marker='*') plt.xlabel('潜空间维度X') plt.ylabel('潜空间维度Y') plt.title('高斯潜空间的光晕散点图(展示不确定性)') plt.grid(alpha=0.3) plt.show()
方法二:基于核密度的平滑光晕
如果你想要更平滑的光晕效果,可以用高斯核密度估计来绘制密度填充区域,这种方式能更细腻地体现分布的不确定性:
需要额外导入scipy的核密度模块:
from scipy.stats import gaussian_kde
然后绘制平滑光晕图:
plt.figure(figsize=(8, 6)) for mu_x, mu_y, sigma_x, sigma_y, rho in gaussian_params: cov_matrix = [[sigma_x**2, rho*sigma_x*sigma_y], [rho*sigma_x*sigma_y, sigma_y**2]] # 生成样本点用于核密度计算 samples = np.random.multivariate_normal([mu_x, mu_y], cov_matrix, 500) # 计算高斯核密度 kde = gaussian_kde(samples.T) # 生成绘图网格 x_range = (mu_x - 3*sigma_x, mu_x + 3*sigma_x) y_range = (mu_y - 3*sigma_y, mu_y + 3*sigma_y) xx, yy = np.mgrid[x_range[0]:x_range[1]:100j, y_range[0]:y_range[1]:100j] positions = np.vstack([xx.ravel(), yy.ravel()]) # 计算网格上的密度值 density_values = kde(positions).reshape(xx.shape) # 绘制填充等高线作为光晕,用颜色深浅和透明度体现密度 plt.contourf(xx, yy, density_values, levels=10, cmap='Blues', alpha=0.3) # 叠加中心均值点 plt.scatter(mu_x, mu_y, s=100, alpha=1, color='darkblue', marker='*') plt.xlabel('潜空间维度X') plt.ylabel('潜空间维度Y') plt.title('高斯潜空间的平滑光晕图(基于核密度)') plt.grid(alpha=0.3) plt.show()
额外小技巧
如果你的示例图包含明确的误差范围(比如1σ、2σ椭圆),可以结合matplotlib.patches.Ellipse绘制误差椭圆,再和光晕效果叠加,进一步增强不确定性的表达。
内容的提问来源于stack exchange,提问作者Li Jeff
相关产品推荐
相关产品推荐

