You need to enable JavaScript to run this app. 基于pandas DataFrame行列索引设定网格的热力图绘制
优惠活动
大模型
产品
解决方案
定价
更多

基于pandas DataFrame行列索引设定网格的热力图绘制

调整方案说明

问题本质

直接调用plt.imshow(df)绘制时,该函数默认以输入数组的整数像素下标(从0开始计数)作为坐标轴刻度依据,不会自动识别Pandas DataFrame自带的列、行索引作为真实坐标值,因此最终生成的轴刻度只会显示0、1、2…这类整数标签,和定义的实际x(5-8)、y(-1-8)范围完全不匹配。同时imshow默认将数组原点放在左上角,还容易出现y轴方向颠倒的错位问题。

可落地的调整方法

方法1:手动绑定刻度与索引值(通用场景,适配任意间隔的坐标)

不管坐标是否等间隔,都可以直接把imshow默认的整数像素位置,替换为你定义的真实x/y值作为刻度标签:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 复现示例数据
x = [5, 5.5, 6, 6.5, 7, 7.5, 8]
y = [-1 ,0, 1, 2, 3, 4, 5, 6, 7,8]
array = np.random.rand(len(y), len(x))
df = pd.DataFrame(array, index=y, columns=x)

# 指定origin为lower,让数组第一行对应纵轴最底部(符合常规坐标系习惯)
plt.imshow(df.values, cmap='viridis', origin='lower')
# 手动设置刻度位置:像素中心的整数位置 对应 真实x/y值
plt.xticks(ticks=np.arange(len(x)), labels=x)
plt.yticks(ticks=np.arange(len(y)), labels=y)
plt.colorbar()
plt.show()

方法2:通过extent参数映射坐标范围(适配等间隔规则网格)

如果你的x、y是均匀间隔的规则坐标,可以通过extent参数直接把像素坐标和实际数值坐标做映射,不需要逐个设置刻度:

# 计算坐标边界:取相邻点步长的一半作为网格中心的边界偏移
dx = x[1] - x[0]
dy = y[1] - y[0]
# extent参数格式为 [x左边界, x右边界, y下边界, y上边界]
extent = [
    x[0] - dx/2,
    x[-1] + dx/2,
    y[0] - dy/2,
    y[-1] + dy/2
]

plt.imshow(
    df.values, 
    cmap='viridis', 
    origin='lower', 
    extent=extent,
    aspect='auto' # 自动适配轴比例,避免图形被强制拉成正方形
)
# 直接限制轴范围到目标x、y区间
plt.xlim(5, 8)
plt.ylim(-1, 8)
plt.colorbar()
plt.show()

方法3:用pcolormesh绘制(灵活适配不规则网格)

如果x、y坐标不是等间隔的,可以直接用pcolormesh接口,传入实际的列、行索引作为网格坐标,不需要手动计算映射关系:

# 直接传入DataFrame的列(x轴)、行(y轴)作为网格坐标
plt.pcolormesh(
    df.columns, 
    df.index, 
    df.values, 
    cmap='viridis'
)
plt.colorbar()
plt.show()

避坑提示

  • 调用imshow时必须显式指定origin='lower',否则数组的第一行(对应你定义的y=-1)会被放在图的最顶部,出现y轴上下颠倒的错位。
  • 坐标非等间隔时不要硬用extent参数,否则会出现网格拉伸、坐标和实际位置错位的问题,优先选手动绑刻度或者pcolormesh的方案。
  • 传值时建议显式传入df.values给绘图接口,虽然直接传df也能正常取数,但显式传值可以避免后续因DataFrame索引顺序变动导致的错位问题。

内容的提问来源于stack exchange,提问作者Jan Rostenkowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 23:06:08