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

如何可视化含字符与数值的二维object类型Numpy数组

刚好碰到过类似的需求,咱们可以一步步来实现这个混合类型数组的可视化,完美复刻你想要的效果:

核心思路

因为plt.imshow只认数值型数组,所以我们需要把原数组里的字符串('g'、'd')和数值分开处理:

  • 先提取数值部分,把非数值区域设为NaN(这样绘制时会透明)
  • 再分别给'g'、'd'对应的掩码区域填充固定颜色
  • 最后组合起来,加上颜色条和图例区分不同元素

完整代码示例

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch

# 你的示例数组
arr = np.array([
    [0, 0, 'g', 'g', 'g'],
    [0, 0, 0, 'g', 'g'],
    ['d', 0, 1, 1, 'g'],
    ['d', 'd', 1, 1, 'g'],
    ['d', 'd', 'd', 'd', 'g']
], dtype=object)

# 1. 生成各类元素的掩码
mask_g = arr == 'g'
mask_d = arr == 'd'
# 2. 提取数值部分,转换为float,非数值区域设为NaN
num_arr = np.where((~mask_g) & (~mask_d), arr.astype(float), np.nan)

# 3. 开始可视化
fig, ax = plt.subplots(figsize=(6, 6))

# 先绘制数值区域,用viridis色阶展示数值变化
im_num = ax.imshow(num_arr, cmap='viridis', 
                   vmin=np.nanmin(num_arr), vmax=np.nanmax(num_arr))

# 绘制'g'区域:黄色
ax.imshow(np.where(mask_g, 1, np.nan), cmap=ListedColormap(['#FFFF00']), alpha=1)
# 绘制'd'区域:绿色
ax.imshow(np.where(mask_d, 1, np.nan), cmap=ListedColormap(['#008000']), alpha=1)

# 4. 添加辅助元素
# 数值区域的颜色条
cbar = fig.colorbar(im_num, ax=ax, fraction=0.046, pad=0.04)
cbar.set_label('Numerical Values')

# 图例区分'g'和'd'
legend_elements = [
    Patch(facecolor='#FFFF00', label='g'),
    Patch(facecolor='#008000', label='d')
]
ax.legend(handles=legend_elements, loc='upper right')

# 调整刻度,让每个格子对齐
ax.set_xticks(np.arange(arr.shape[1]))
ax.set_yticks(np.arange(arr.shape[0]))

plt.show()

关键细节说明

  • 数值兼容性:不管是整数还是浮点数,astype(float)都能完美处理,数值的色阶变化会自动适配
  • 颜色自定义:如果不满意默认的黄/绿色,直接替换十六进制颜色码或者颜色名称即可(比如'orange'、'darkgreen')
  • 层级控制:先画数值层,再画字符串层,确保字符串颜色完全覆盖底层的NaN区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:42:58