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

如何为二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:24:32