如何在Matplotlib中保持图形不变,修改坐标轴刻度与坐标系?
Matplotlib热力图坐标轴调整方案
核心思路
不用替换plt.matshow,直接在其生成的轴对象上修改刻度映射,同时调整坐标系方向(因为matshow默认Y轴从上到下递增,和地理坐标系逻辑相反)。
方法一:直接修改matshow的轴刻度
你的数据集是100×100的二维数组,X轴索引0-99对应实际经度13-14,Y轴索引0-99对应实际纬度14.5-15.5,代码修改如下:
import matplotlib.pyplot as plt # 绘制热力图并获取轴对象 ax = plt.matshow(dataslice, interpolation="nearest") plt.colorbar() # 自定义刻度数量,可根据需求调整 num_ticks = 5 # 设置X轴刻度:将原索引映射为实际经度 x_ticks = plt.linspace(0, 99, num_ticks) x_labels = plt.linspace(13, 14, num_ticks) ax.axes.set_xticks(x_ticks) ax.axes.set_xticklabels([f"{x:.2f}" for x in x_labels]) # 设置Y轴刻度:将原索引映射为实际纬度,同时翻转Y轴匹配地理坐标系 y_ticks = plt.linspace(0, 99, num_ticks) y_labels = plt.linspace(14.5, 15.5, num_ticks) ax.axes.set_yticks(y_ticks) ax.axes.set_yticklabels([f"{y:.2f}" for y in y_labels]) ax.axes.invert_yaxis() plt.xlabel("Longitude") plt.ylabel("Latitude") plt.savefig(f"{file_name}_Data.png") plt.show()
方法二:用imshow配合extent参数(替代matshow)
如果想用fig, ax = plt.subplots(),可以用imshow并通过extent直接指定实际坐标范围,更直观:
import matplotlib.pyplot as plt fig, ax = plt.subplots() # extent参数格式:[xmin, xmax, ymin, ymax] im = ax.imshow(dataslice, interpolation="nearest", extent=[13, 14, 14.5, 15.5]) plt.colorbar(im) # 翻转Y轴,让纬度从下到上递增 ax.invert_yaxis() ax.set_xlabel("Longitude") ax.set_ylabel("Latitude") plt.savefig(f"{file_name}_Data.png") plt.show()
补充说明
matshow默认Y轴从上到下是0到矩阵行数-1,所以需要用invert_yaxis()翻转,让实际纬度(14.5-15.5)从下到上递增。- 两种方法都能保持热力图的图形效果不变,仅修改坐标轴的刻度显示和坐标系方向。
内容的提问来源于stack exchange,提问作者Abir Abhyankar
相关产品推荐
相关产品推荐

