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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:10:29