如何可视化含字符与数值的二维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
相关产品推荐
相关产品推荐

