如何在Matplotlib中绘制热图样式的水平条形图?
实现水平一维数值的颜色渐变条形图(单行热图)
要实现你需求的效果,用matplotlib.pcolormesh比普通条形图更合适,它能直接根据数值映射颜色,完美模拟单行热图的效果,同时满足正负值分别用蓝、红渐变,0为白色的要求。
完整实现代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap, Normalize # 生成模拟数据 np.random.seed(9) simu_data = np.random.randint(-100000, 100000, size=200).cumsum() # 1. 数据格式转换:将一维数组转为二维(pcolormesh要求二维输入) data_2d = simu_data.reshape(1, -1) # 创建x轴坐标:每个数据点对应一个区间,长度和数据一致 x = np.arange(data_2d.shape[1] + 1) y = np.arange(2) # 仅一行,所以y轴取两个点形成一个行高度 # 2. 自定义颜色映射:负蓝、0白、正红 colors = [ (0, 0, 1), # 最小值:深蓝色 (1, 1, 1), # 0:白色 (1, 0, 0) # 最大值:深红色 ] cmap = LinearSegmentedColormap.from_list("custom_blue_white_red", colors) # 3. 设置颜色归一化:确保0对应颜色映射的中间点 vmin = simu_data.min() vmax = simu_data.max() norm = Normalize(vmin=vmin, vmax=vmax) # 4. 绘制单行热图 fig, ax = plt.subplots(figsize=(12, 2)) im = ax.pcolormesh(x, y, data_2d, cmap=cmap, norm=norm) # 调整样式:隐藏y轴刻度和边框 ax.set_yticks([]) ax.set_xlim(0, len(simu_data)) # 添加颜色条,标注数值含义 fig.colorbar(im, ax=ax, orientation="horizontal", pad=0.2, label="数值大小") plt.tight_layout() plt.show()
关键部分说明
- 数据转二维:
pcolormesh需要二维数组输入,所以把一维数组转成(1, N)的形状,y轴设置两个点来形成单行的高度。 - 自定义颜色映射:通过
LinearSegmentedColormap创建从蓝到白再到红的渐变,精准对应负、0、正的颜色需求。 - 颜色归一化:
Normalize确保数值范围被正确映射到颜色条,0刚好落在白色的位置。 - 样式调整:隐藏y轴元素,让图表更贴近"水平条形热图"的视觉效果,颜色条横向放置更直观。
运行代码后,你会得到一个水平的单行热图,每个位置的颜色深度对应simu_data的数值大小,负值为蓝色系,正值为红色系,0附近为白色。
内容的提问来源于stack exchange,提问作者skywave1980
相关产品推荐
相关产品推荐

