You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Matplotlib的imshow()绘制三个2D密度图并优化显示效果?

解决Matplotlib imshow多密度图颜色区分度低的实用方案

1. 给每个子图单独适配颜色范围

别共用一套归一化参数,针对每个密度数据单独设置vmin和vmax,甚至用百分位数过滤极端值,避免少数高值把整个颜色范围拉平。比如:

import matplotlib.pyplot as plt
import numpy as np

# 假设n0、n1、n2是你的2D密度数组
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

# 处理n0:用1%和99%百分位数截断极端值
im0 = axes[0].imshow(n0, vmin=np.percentile(n0, 1), vmax=np.percentile(n0, 99))
axes[0].set_title('n0 Density')
fig.colorbar(im0, ax=axes[0])

# 同理处理n1和n2
im1 = axes[1].imshow(n1, vmin=np.percentile(n1, 1), vmax=np.percentile(n1, 99))
axes[1].set_title('n1 Density')
fig.colorbar(im1, ax=axes[1])

im2 = axes[2].imshow(n2, vmin=np.percentile(n2, 1), vmax=np.percentile(n2, 99))
axes[2].set_title('n2 Density')
fig.colorbar(im2, ax=axes[2])

plt.tight_layout()
plt.show()

2. 用对数颜色映射处理数量级差异

如果三个数据是数量级上的差异(比如一个是几百,一个是几十万),对数缩放能直接拉开不同量级的颜色区分度。注意要排除0值,避免对数计算报错:

from matplotlib.colors import LogNorm

# 以n0为例,取非0最小值作为vmin
im0 = axes[0].imshow(n0, norm=LogNorm(vmin=n0[n0>0].min(), vmax=n0.max()))

3. 自定义分段颜色映射

如果数据有明显的区间分界,手动做分段colormap,让不同区间的颜色差异更扎眼:

from matplotlib.colors import BoundaryNorm, ListedColormap

# 自定义分界点和对应的颜色
bounds = [0, 100, 1000, 10000, 100000]
colors = ['#ffffcc','#c7e9b4','#7fcdbb','#41b6c4','#2c7fb8']
cmap = ListedColormap(colors)
norm = BoundaryNorm(bounds, cmap.N)

im = axes[0].imshow(n0, cmap=cmap, norm=norm)

4. 别叠加,用子图直接对比

叠加多个密度图本来就容易因为颜色混合、透明度问题导致模糊,不如把三个图放在同一画布的子图里,直接对比每个图的细节,反而更清晰。


内容的提问来源于stack exchange,提问作者Hossein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:50:04