关于Matplotlib contourf双矩阵异色同图绘制的技术问询
如何在同一张contourf图中用不同colormap绘制互斥非零区域的两个矩阵
没问题,你的需求完全可以轻松实现——因为两个矩阵的非零区域完全互斥,我们可以直接分别调用contourf绘制,根本不用担心图层重叠冲突,它们的有效区域本来就不会互相覆盖。你的示例代码已经找对了方向,我再帮你优化一下细节,让效果更贴合机器学习决策面的展示需求:
优化后的完整代码
import numpy as np import matplotlib.pyplot as plt # 生成可复现的示例数据 np.random.seed(42) matrixA = np.random.randn(10, 10) matrixB = np.random.randn(10, 10) # 快速创建互斥掩码矩阵(比索引操作更简洁) mask = np.random.uniform(0, 1, (10, 10)) matrixA_masked = np.where(mask > 0.5, matrixA, 0) matrixB_masked = np.where(mask <= 0.5, matrixB, 0) # 创建网格坐标 x = np.linspace(0, 10, 10) X, Y = np.meshgrid(x, x) # 分别绘制两个矩阵的contourf,使用不同colormap plt.contourf(X, Y, matrixA_masked, cmap='gray', levels=20) plt.contourf(X, Y, matrixB_masked, cmap='winter', levels=20) # 可选:添加双颜色条,分别对应两个矩阵的数值范围 from matplotlib.colors import Normalize from matplotlib.cm import ScalarMappable # 只计算非零区域的数值范围,避免零值干扰颜色映射 norm_a = Normalize(vmin=matrixA_masked[matrixA_masked!=0].min(), vmax=matrixA_masked[matrixA_masked!=0].max()) norm_b = Normalize(vmin=matrixB_masked[matrixB_masked!=0].min(), vmax=matrixB_masked[matrixB_masked!=0].max()) sm_a = ScalarMappable(norm=norm_a, cmap='gray') sm_a.set_array([]) sm_b = ScalarMappable(norm=norm_b, cmap='winter') sm_b.set_array([]) plt.colorbar(sm_a, label='Matrix A 数值') plt.colorbar(sm_b, label='Matrix B 数值') plt.title('互斥区域双Colormap Contourf(机器学习决策面示例)') plt.show()
关键细节说明
- 互斥区域的天然优势:因为
matrixA_masked和matrixB_masked的非零区域完全不重叠,第二次contourf只会在第一次没覆盖的区域渲染颜色,零值区域会被自动忽略,不会出现颜色覆盖的问题。 - 代码简化:用
np.where直接生成掩码矩阵,省去了手动索引赋值的繁琐步骤,代码更易读维护。 - 颜色映射优化:通过只计算非零区域的
vmin/vmax,避免零值拉低颜色映射的范围,让有效区域的颜色过渡更精准。 - 平滑度提升:添加
levels=20参数,让contourf的颜色分层更细腻,适合展示连续型的决策面数值。
分类决策面适配
如果你的场景是分类任务(矩阵存储的是类别标签而非连续数值),可以把contourf换成pcolormesh,这样每个区域会显示单一纯色,更贴合分类决策面的可视化需求:
# 分类场景示例代码片段 plt.pcolormesh(X, Y, matrixA_masked, cmap='gray', edgecolors='white') plt.pcolormesh(X, Y, matrixB_masked, cmap='winter', edgecolors='white')
内容的提问来源于stack exchange,提问作者jdeJuan
相关产品推荐
相关产品推荐

