- 积分
- 25852
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-9-4
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
下午群里有人问到怎么在组图里插入南海小地图,试出来的方法总结如下。在公众号的很多画图教程里,南海小地图的 GeoAxes 都是通过 fig.add_axes([left, bottom, width, height]) 方法添加。为了控制小地图的大小、让它位于大地图的右下角并与边框对齐,需要手动调整 [left, bottom, width, height] 参数的值。这样不仅非常繁琐,并且在画组图时更是会让人无从下手。这里利用大地图在 figure 上的位置,根据这个参数按需求决定小地图的位置。
实现上是先用 get_position 方法获取大地图的位置,然后考虑到 GeoAxes 的 aspect_ratio 固定为 1,其经纬度范围决定好之前形状是未知的,所以等到小地图的绘图流程结束后,再等比例缩小其宽高,最后利用 set_position 方法移动到大地图的右下角。
这个方法的优点是需要调节的参数只有 shrink 一个,不再需要我们手动试错了。缺点是仅适用于方形边框的大地图,对于扇形边框恐怕还得手动设置,不知道坛友有没有别的方法。
- import matplotlib.pyplot as plt
- import matplotlib.transforms as mtransforms
- import cartopy.crs as ccrs
- def adjust_sub_axes(ax_main, ax_sub, shrink):
- '''
- 将ax_sub调整到ax_main的右下角. shrink指定缩小倍数.
- 当ax_sub是GeoAxes时, 需要在其设定好范围后再使用此函数.
- '''
- bbox_main = ax_main.get_position()
- bbox_sub = ax_sub.get_position()
- # 使shrink=1时ax_main与ax_sub等宽或等高.
- if bbox_sub.width > bbox_sub.height:
- ratio = bbox_main.width / bbox_sub.width * shrink
- else:
- ratio = bbox_main.height / bbox_sub.height * shrink
- wnew = bbox_sub.width * ratio
- hnew = bbox_sub.height * ratio
- bbox_new = mtransforms.Bbox.from_extents(
- bbox_main.x1 - wnew, bbox_main.y0,
- bbox_main.x1, bbox_main.y0 + hnew
- )
- ax_sub.set_position(bbox_new)
- proj = ccrs.PlateCarree()
- fig = plt.figure(figsize=(10, 8))
- subplot_kw = {'projection': proj}
- axes_main = fig.subplots(3, 3, subplot_kw=subplot_kw)
- axes_sub = fig.subplots(3, 3, subplot_kw=subplot_kw)
- extents_main = [75, 135, 5, 55]
- extents_sub = [105, 125, 0, 25]
- for ax_main, ax_sub in zip(axes_main.flat, axes_sub.flat):
- ax_main.set_extent(extents_main, crs=proj)
- ax_main.stock_img()
- ax_sub.set_extent(extents_sub, crs=proj)
- ax_sub.stock_img()
- adjust_sub_axes(ax_main, ax_sub, shrink=0.3)
- plt.show()
复制代码
|
评分
-
查看全部评分
|