使用python封装函数为每一幅子图上添加小地图,以中国南海为例,绘制结果如下所示:

在这里插入图片描述

其中,主要封装了两个函数,一个用来绘制小地图,一个用来添加海洋、陆地、湖泊、河流等属性,而图中多个子图通过for 循环进行绘制。

代码如下:

import matplotlib.pyplot as plt

import matplotlib.transforms as mtransforms

import cartopy.crs as ccrs

import cartopy.feature as cfeature

import numpy as np

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()
    
    ratio = bbox_main.width / bbox_sub.width
    
    wnew = bbox_sub.width* ratio * shrink
    
    hnew = bbox_sub.height*ratio* shrink
    
    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)
    
def map(ax):
    ax.coastlines()
    
    ax.add_feature(cfeature.OCEAN)
    
    ax.add_feature(cfeature.LAND, edgecolor='black')
    
    ax.add_feature(cfeature.LAKES, edgecolor='black')
    
    ax.add_feature(cfeature.RIVERS)
    
    
    return ax
### 设置投影、画板、子图个数、子图区域
proj = ccrs.PlateCarree()
fig   =   plt.figure(figsize=(10,8),dpi=100)
subplot_kw   =   {'projection': proj}                                     
axes_main = fig.subplots(2, 2, subplot_kw=subplot_kw)
axes_sub  = fig.subplots(2, 2, subplot_kw=subplot_kw)
box_main =[59,151, 0,60]
box_sub = [116,124,20,28]
### 循环绘制子图
for a_main,a_sub in zip(axes_main.flat, axes_sub.flat):
    ax1=a_main
    ax1=map(ax1)
    gl=ax1.gridlines(draw_labels=True, xlocs=[60,90,120,150],ylocs=[10,30,50])
    gl.xlabels_top = None
    gl.ylabels_right = False
    ax1.set_extent(box_main, crs=proj)
    #===================a_sub=================================================
    ax2=a_sub
    ax2=map(ax2)
    ax2.set_extent(box_main, crs=proj)
    adjust_sub_axes(a_main,a_sub,shrink=.3)
   
plt.show()

简单记录一下,可能还有许多细节没有处理到位,欢迎交流~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐