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

如何基于[x,y,value]格式的NumPy数组绘制带自定义标签的热力图?

问题描述

我有一个示例数组:my_array = [[10,12,0],[10,13,1],[11,12,1],[11,13,0],[12,12,1],[12,13,0]],每个元素格式为[x,y,value]。我想要绘制热力图,以x值为X轴、y值为Y轴,颜色由value(0或1)决定,且将0对应的颜色标注为'A points',1对应的标注为'B points'。尝试了多种方法但未成功,附上尝试的代码:

xvals = [10,11,12]
yvals = [12,13]

zvals = [[10,12,0],[10,13,1],[11,12,1],[11,13,0],[12,12,1],[12,13,0]]


heatmap, ax = plt.subplots()

im = ax.imshow(zvals,cmap='inferno',extent=[xvals[0],xvals[2],yvals[0],yvals[1]],interpolation='nearest',origin='lower',aspect='auto')
ax.set(xlabel='some x', ylabel='some y')

cbar = heatmap.colorbar(im)
cbar.ax.set_ylabel('stuff')

heatmap.savefig('heatmap.png')
问题分析

你之前的代码核心问题是:imshow要求输入二维数值矩阵(行对应Y轴刻度、列对应X轴刻度),但你传入的是原始的坐标-值列表,导致imshow无法正确解析数据结构,自然生成不了预期的热力图。

解决方案

先把原始坐标数据转换成符合imshow要求的二维矩阵,再自定义颜色映射和标签,以下是完整可运行的代码:

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

# 原始数据
my_array = np.array([[10,12,0],[10,13,1],[11,12,1],[11,13,0],[12,12,1],[12,13,0]])

# 提取x、y、value列
x = my_array[:, 0]
y = my_array[:, 1]
value = my_array[:, 2]

# 获取X、Y轴的唯一刻度值
x_vals = np.unique(x)
y_vals = np.unique(y)

# 创建对应二维网格矩阵,行对应y刻度,列对应x刻度
grid = np.zeros((len(y_vals), len(x_vals)))
for xi, yi, val in my_array:
    x_idx = np.where(x_vals == xi)[0][0]
    y_idx = np.where(y_vals == yi)[0][0]
    grid[y_idx, x_idx] = val

# 自定义颜色映射:0对应蓝色,1对应橙色(可自行调整)
cmap = ListedColormap(['#1f77b4', '#ff7f0e'])
# 设置颜色边界,确保0和1的颜色划分准确
bounds = [-0.5, 0.5, 1.5]
norm = plt.cm.colors.BoundaryNorm(bounds, cmap.N)

# 绘制热力图
fig, ax = plt.subplots()
im = ax.imshow(grid, cmap=cmap, norm=norm, 
               extent=[x_vals[0]-0.5, x_vals[-1]+0.5, y_vals[0]-0.5, y_vals[-1]+0.5],
               interpolation='nearest', origin='lower', aspect='auto')

# 设置坐标轴标签和刻度
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_xticks(x_vals)
ax.set_yticks(y_vals)

# 添加颜色条并替换标签
cbar = fig.colorbar(im, ticks=[0, 1])
cbar.ax.set_yticklabels(['A points', 'B points'])
cbar.set_label('Point Type')

plt.tight_layout()
plt.savefig('heatmap.png')
plt.show()
关键说明
  1. 数据转换:将原始的坐标-值对,映射为以Y轴刻度为行、X轴刻度为列的二维矩阵,确保每个单元格对应正确的value值。
  2. 颜色自定义:用ListedColormap指定0和1的对应颜色,BoundaryNorm确保颜色条的刻度严格对应0和1的分界。
  3. 坐标轴对齐:调整extent参数让热力图单元格与X、Y轴刻度对齐,避免视觉偏移。
  4. 标签替换:直接将颜色条的刻度标签改为'A points'和'B points',满足需求。

内容的提问来源于stack exchange,提问作者Quim Quadrada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:24