如何基于[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()
关键说明
- 数据转换:将原始的坐标-值对,映射为以Y轴刻度为行、X轴刻度为列的二维矩阵,确保每个单元格对应正确的value值。
- 颜色自定义:用
ListedColormap指定0和1的对应颜色,BoundaryNorm确保颜色条的刻度严格对应0和1的分界。 - 坐标轴对齐:调整
extent参数让热力图单元格与X、Y轴刻度对齐,避免视觉偏移。 - 标签替换:直接将颜色条的刻度标签改为'A points'和'B points',满足需求。
内容的提问来源于stack exchange,提问作者Quim Quadrada
相关产品推荐
相关产品推荐

