如何在保留自定义轴范围的同时让热力图坐标轴尺寸相等?
保留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
相关产品推荐
相关产品推荐

