【问题标题】:Force aspect ratio for a map强制地图的纵横比
【发布时间】:2013-03-06 23:36:24
【问题描述】:

如果我定义一组具有给定高度和宽度的(地理)轴,我如何确保绘图将填充这些轴?

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

ax = plt.axes([0.3, 0.1, 0.4, 0.8], projection=ccrs.PlateCarree())
ax.coastlines()
ax.set_global()
plt.show()

这会为地图生成一个具有合理纵横比的图,但我希望它改为填充轴,从而导致图的高度大于宽度。这只是一个示例,但在现实世界中这样做很重要。

编辑

只是为了校准,我实际上希望结果被扭曲,所以在我的示例中,我真的想要一个全局范围大于宽度的地图。使用 ax.set_aspect('auto') 似乎适用于 PlateCarree 和 NorthPolarStereographic 投影,但可能不适用于所有人(例如 OSGB)。

【问题讨论】:

    标签: cartopy


    【解决方案1】:

    好问题。我已经关注这个问题好几个月了 (https://github.com/SciTools/cartopy/issues/9)。

    我最近了解了 matplotlib 的 ax.set_adjustable 方法(here in fact)。 使用它,您可以通过更改数据限制来告诉具有固定(数据)纵横比的轴来填充它可以填充的空间。

    例如:

    import matplotlib.pyplot as plt
    
    
    ax = plt.axes([0.25, 0.05, 0.5, 0.9])
    ax.set_aspect(1)
    
    ax.plot(range(10))
    ax.set_adjustable('datalim')
    
    plt.show()
    

    生成一个非方形图(在 x 和 y 维度上具有相等的长度比例)。

    在我看来,这也可以应用于 cartopy 地图:

    import matplotlib.pyplot as plt
    import cartopy.crs as ccrs
    
    
    ax = plt.axes([0.25, 0.05, 0.5, 0.9], projection=ccrs.PlateCarree())
    ax.coastlines()
    ax.set_adjustable('datalim')
    
    ax.set_ylim([-90, 90])
    
    plt.show()
    

    我想知道这是否适合您的需求?

    【讨论】:

    • 不完全是。结果我只需要ax.set_aspect('auto') 就可以按预期完成这项工作。
    • 感谢您告诉我。您是否介意将此添加为答案并接受它(如果您愿意,也可以接受我自己的答案)。干杯
    • @ajdawson 建议的 ax.set_aspect('auto') 对我有用。也许@ajdawson 可以添加这个作为答案?
    • 嗨。我正在尝试在 tkinter 画布上绘制底图,当我使用 ax.set_aspect('auto') 时,地图完全适合整个画布区域。但问题是当我试图放大底图的特定区域时,地图会被拉伸。谁能告诉我如何避免这种情况。
    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2018-06-11
    • 2012-06-24
    • 2013-04-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多