matplotlib Cartopy:设置正方形Map的范围

rvpgvaaj  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(177)

假设我需要用Cartopy绘制一个Map,生成的图形应该是正方形的。在我(过于简单)的理解中,使用plate carrée projection应该很容易,因为经度和纬度直接用作平面坐标。这意味着如果经度和纬度覆盖的范围相同,我希望得到一个正方形的Map。
然而,如果范围从赤道开始(例如[-120, -60, 0, 60]),下面的代码可以工作,但如果范围远离赤道,它就失败了。如何计算范围,以使生成的Map是一个正方形?(我找到了this post,但它没有真正的帮助,因为坐标转换只返回给定的坐标)。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=[5, 5], subplot_kw={'projection': ccrs.PlateCarree()})
fig.subplots_adjust(left=0.0, bottom=0.0, right=1.0, top=1.0)
ax.set_extent([-120, -60, 15, 75])
ax.stock_img()
fig.savefig('Test.pdf')

下图显示了输出,但遗憾的是,输出的垂直边缘包含白色边框:

tzcvj98z

tzcvj98z1#

这会是所选投影的属性吗?通过检查ax._positionax._originalPosition属性,您可以在添加转换时看到它的发生:

Bbox([[0.015576512213622107, 0.0], [0.9844234877863779, 1.0]])
Bbox([[0.0, 0.0], [1.0, 1.0]])

你可以添加ax.set_adjustable('datalim')来改变限制,而不是用方框来填充给定的范围。注意这是如何稍微改变ax.get_xlim()ax.get_ylim()的,所以要确保这是你的应用程序可以接受的。我个人经常在保存时显式添加dpi和bbox,以确保输出具有预期的尺寸,见下面的例子。
当我使用不同的投影时,我可以让它直接工作,下面的代码生成了一个干净的500x500px图像,在输出中只有轴可见,红色的图形不可见,所以这可能是PlateCarree投影的一个属性?

map_proj = ccrs.Mercator()

fig, ax = plt.subplots(
    figsize=(5, 5), dpi=100, facecolor="r",
    subplot_kw={'projection': map_proj},
)

fig.subplots_adjust(left=0.0, bottom=0.0, right=1.0, top=1.0)
ax.set_extent([-10000000, 10000000, -10000000, 10000000], crs=map_proj)
ax.coastlines()

fig.savefig('Test.png', bbox_inches=0, dpi=100)

相关问题