python 绘制封装函数绘制南海小地图

使用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()

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值