如何为二维numpy数组的matplotlib可视化指定不同数值对应颜色
解决方案
你当前代码的核心问题是直接将整个数组传入contourf做色阶映射,把-1(未探测)、100(墙壁)两个特殊分类值也纳入了连续浓度色板的计算范围,自然无法给这两类区域指定固定颜色。按分层绘制的思路修改即可,三类元素按从底层到上层的顺序依次渲染,避免互相覆盖。
核心实现逻辑
- 先通过布尔掩码拆分三类数据,避免特殊值干扰浓度色阶映射
- 按「未探测区→墙壁→浓度等值层」的从下到上顺序绘制,上层元素自动覆盖下层对应位置
- 色条仅绑定浓度层的绘图对象,保证色条刻度只显示20.0~30.0的有效浓度范围
注意:必须严格遵循从底层到上层的绘制顺序,否则会出现元素被错误遮挡的问题
修改后完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据部分保持原有逻辑 df = pd.read_excel("/content/drive/MyDrive/Japan Data/291,194/a 291,194 (11).xlsx") array = df.to_numpy() # 拆分三类数据的掩码 mask_undetected = array == -1 # 未探测区域 mask_wall = array == 100 # 墙壁/障碍物 # 仅保留20~30区间的有效浓度数据,其余值做掩码处理 gas_conc = np.ma.masked_where((array < 20) | (array > 30), array) # 坐标范围对齐,保证不同图层坐标完全匹配 x_coords = np.arange(0, array.shape[1]) y_coords = np.arange(0, array.shape[0]) extent = [x_coords.min(), x_coords.max(), y_coords.min(), y_coords.max()] plt.figure(figsize=(8, 7)) # 第一层:未探测区域 固定灰色 plt.imshow(mask_undetected, cmap="gray", vmin=0, vmax=1, extent=extent) # 第二层:墙壁 固定黑色 plt.imshow(~mask_wall, cmap="gray", vmin=0, vmax=1, extent=extent) # 第三层:气体浓度红色等值填充 contour_layer = plt.contourf( x_coords, y_coords, gas_conc, levels=np.linspace(20, 30, 11), # 按1ppm间隔划分色阶,可按需调整疏密 cmap="Reds", vmin=20, vmax=30, alpha=0.9 ) # 仅为浓度层添加色条 plt.colorbar(contour_layer, label="Gas concentration") plt.xlabel("X position") plt.ylabel("Y position") plt.show()
可选调整项
- 如果需要添加浓度等值线轮廓,可以在
contourf代码后追加plt.contour(x_coords, y_coords, gas_conc, levels=np.linspace(20,30,11), colors="darkred", linewidths=0.5) - 如果觉得红色透明度不合适,修改
contourf的alpha参数即可,取值0~1,数值越大颜色越不透明 - 等值线疏密可以通过修改
levels参数的区间间隔调整,间隔越小色阶过渡越平滑
内容的提问来源于stack exchange,提问作者madtech
相关产品推荐
相关产品推荐

