如何绘制灰度对应高密度区、虚线等高线对应低密度区的密度场图?
对数密度场图绘制方案
- 核心思路:通过灰度热力底图+分层等高线的组合实现需求,用matplotlib的多个函数配合,替代单一的
contour():
生成对数密度场数据
先对原始数据做核密度估计(KDE),转换为网格上的对数密度值:import numpy as np from scipy.stats import gaussian_kde import matplotlib.pyplot as plt # 假设原始数据是二维数组x, y data = np.vstack([x, y]) kde = gaussian_kde(data) # 创建网格 xi, yi = np.mgrid[x.min():x.max():100j, y.min():y.max():100j] zi = kde(np.vstack([xi.flatten(), yi.flatten()])) log_zi = np.log(zi.reshape(xi.shape)) # 取对数得到对数密度场绘制灰度高密度底图
用pcolormesh()绘制灰度热力图,反转色让亮区对应高密度:plt.pcolormesh(xi, yi, log_zi, cmap='gray_r', shading='auto')分层绘制等高线
- 平均密度线:计算对数密度的均值,用实线绘制
- 低密度等高线:设定低密度阈值(比如均值减1倍标准差),用虚线绘制
# 绘制平均密度实线 mean_density = np.mean(log_zi) plt.contour(xi, yi, log_zi, levels=[mean_density], linestyles='solid', colors='black') # 绘制低密度虚线等高线(可多设几个低于阈值的levels) low_density_threshold = mean_density - np.std(log_zi) plt.contour(xi, yi, log_zi, levels=np.linspace(log_zi.min(), low_density_threshold, 3), linestyles='dashed', colors='gray')细节调整
可按需添加颜色条、坐标轴标签,关闭多余边框等,让图更贴合参考样式。
内容的提问来源于stack exchange,提问作者qs liu
相关产品推荐
相关产品推荐

