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

如何在保留自定义轴范围的同时让热力图坐标轴尺寸相等?

保留Matplotlib热力图自定义轴范围,同时让x/y轴物理尺寸相等

现有代码设置了x轴范围(0,2)、y轴范围(0,5),要保留这个轴范围的同时,让x轴和y轴的显示长度一样(物理尺寸相等),还要让热力图填满整个轴区域,别留空白。

原始代码

import matplotlib.pyplot as plt
import numpy as np

# 创建热力图数据集
x = np.linspace(0, 2, 100)
y = np.linspace(0, 5, 100)
Z = np.random.rand(100, 100)

# 创建画布和轴对象
fig, ax = plt.subplots()

# 设置x轴范围
ax.set_xlim([0, 2])

# 绘制热力图
im = ax.imshow(Z, extent=[0, 2, 0, 5])

# 设置标签和标题
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('自定义X轴范围的热力图')

# 显示图像
plt.show()

原始运行效果:
原始热力图

试了ax.set_box_aspect(1),轴确实变成正方形了,但热力图居中,两边留了空白:
尝试后的热力图

解决办法

问题出在imshow默认的aspect='equal',它强制热力图保持数据比例,导致在正方形轴里填不满。给你两种可行方案:

方案1:按数据范围比例设置轴纵横比

计算x、y轴范围的长度比,把轴的纵横比设成这个值,既能让轴的物理尺寸相等,又能让热力图填满区域:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)
y = np.linspace(0, 5, 100)
Z = np.random.rand(100, 100)

fig, ax = plt.subplots()

ax.set_xlim([0, 2])
im = ax.imshow(Z, extent=[0, 2, 0, 5])

# 计算x范围长度/ y范围长度,设置为轴的纵横比
ax.set_aspect((2 - 0)/(5 - 0))

ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('轴尺寸相等的热力图')

plt.show()

方案2:让热力图自适应轴尺寸

给imshow加aspect='auto',让热力图跟着轴的大小走,再设置ax.set_box_aspect(1)把轴改成正方形,这样热力图就会填满整个正方形轴:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)
y = np.linspace(0, 5, 100)
Z = np.random.rand(100, 100)

fig, ax = plt.subplots()

ax.set_xlim([0, 2])
# 让热力图自适应轴尺寸
im = ax.imshow(Z, extent=[0, 2, 0, 5], aspect='auto')
# 设置轴为正方形
ax.set_box_aspect(1)

ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('轴尺寸相等的热力图')

plt.show()

这两种方法都能满足需求:保留自定义的轴范围,x/y轴显示长度一样,热力图填满轴区域没空白。

内容的提问来源于stack exchange,提问作者Anish Nahar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:05:28