使用matplotlib在python中将坐标轴范围改变为纬度和经度

0 投票
2 回答
4750 浏览
提问于 2025-04-18 12:17

我想知道如何使用y轴和x轴,这些轴与图中的数据没有关系。比如,我想用下面的代码把世界地图作为一张图片来绘制:

import matplotlib.pyplot as plt

fig = plt.figure()
plt.imshow(world_map)

结果是,我得到了x轴从左到右是0到image_size_x,y轴从上到下是0到image_size_y。我该怎么做才能把这些轴的范围改成经纬度格式?也就是说,图的轴应该在x和y两个方向上都显示从90到-90的度数,而不管图中实际绘制的数据是什么。

设置

pylab.ylim([90,-90]) 

会把图片向下移动90像素,并把图片的y维度缩小到image_size_y/90的比例。所以这样做不行,因为xlim和ylim是根据图中绘制的数据来工作的。

2 个回答

1

简单来说:在使用 imshow 时,记得加上 extent 这个关键词。

代码示例:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subaxis(111)
ax.imshow(world_map, extent=[-180,180,-90,90], aspect='auto')

如果你的地图显示是倒过来的,可以在 imshow 里加上 origin='lower' 这个参数。还有,aspect='auto' 是为了让地图在两个方向上都能独立缩放。后面用 add_subaxis 加的额外行只是为了让代码更面向对象,真正重要的还是那些关键词参数。

如果不在 imshow 中提供图像的范围,它会默认每个像素都在 (0,0), (0,1), ..., (Nx-1, Ny-1) 这些位置上居中,然后图像的范围会从 (-0.5, -0.5) 开始。

0

假设(根据你的帖子)图片是没问题的,但坐标轴的标签不对,试试这个方法,它可以手动设置坐标轴的标签:

plt.figure(1)     
ax = plt.subplot(111)
#... do your stuff
#need to figure out your image size divided by the number of labels you want
#FOR EXample, if image size was 180, and you wanted every second coordinate labeled:
ax.set_xticks([i for i in range(0,180,2)]) #python3 code to create 90 tick marks
ax.set_xticklabels([-i for i in range(-90,90,2)]) #python3 code to create 90 labels
#DO SAME FOR Y

我用的技巧是先确定你想要多少个标签(这里是90个:180/2),然后在范围(0,图片大小)内均匀地添加刻度线,最后手动设置标签。这里有一个通用的公式:

ax.set_xticks([i for i in range(0,IMAGE_SIZE,_EVERY_XTH_COORD_LABELED)]) #python3 code to create 90 tick marks
ax.set_xticklabels([-i for i in range(-90,90,EVERY_XTH_COORD_LABELED)]) #python3 code to create 90 labels

撰写回答