爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 374|回复: 3

[经验总结] 极射赤面投影下圆形地图边框的加粗和标签的调整(以北极为例)

[复制链接]

新浪微博达人勋

发表于 2024-9-21 19:23:00 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 喂喂喂卫生单位 于 2024-9-21 19:25 编辑

最近在做和北极相关的分析,发现python画北极区域比MATLAB的m_map要麻烦不少。cartopy库虽然提供了极射赤面投影,但是不进一步从matplotlib中对地图进行调整的话,绘制出来的图仍是长方形的。
方→圆在网络上有很多代码,基本形式如下:

import numpy as np
import matplotlib.path as mpath
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5, 0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
fig_ax1.set_boundary(circle, transform=f3_ax1.transAxes)
这样地图边框就是圆形的了。但由于我习惯给边框加粗,这样的代码无法满足我的要求。经过一段时间的尝试后我发现,利用matplotlib绘制曲线路径的命令,在框上再画一个更粗的框,从而实现我的想法,代码和示意图如下:

import numpy as np
import matplotlib.path as mpath
from matplotlib.patches import PathPatch
theta = np.linspace(0, 2*np.pi, 100)
center, radius = [0.5,0.5], 0.5
verts = np.vstack([np.sin(theta), np.cos(theta)]).T
circle = mpath.Path(verts * radius + center)
circle_patch = PathPatch(circle,transform=fig_ax1.transAxes
                         ,facecolor='none', edgecolor='k', linewidth=3)  
fig_ax1.add_patch(circle_patch)
fig_ax1.set_boundary(circle, transform=fig_ax1.transAxes)

同时,matplotlib库默认给圆图打标签的方式并不友好,位于中轴的标签往往不是水平放置的。在网上找了很久也没找到在圆图调整标签角度的代码,于是我想了一个比较复杂的处理方法,供大家参考:

import matplotlib.ticker as mticker
g1=fig_ax1.gridlines(crs=ccrs.PlateCarree(),draw_labels=True,
                     color='none')
g1.xlocator = mticker.FixedLocator([-120,-60,60,120])
g1.ylocator = mticker.FixedLocator([0])
g1.xlabel_style = {'size': 16, 'color': 'black'}
g1.ylabel_style = {'size': 0, 'color': 'black'}  
g2=fig_ax1.gridlines(crs=ccrs.PlateCarree(),draw_labels=True,
                     color='none')
g2.xlocator = mticker.FixedLocator([0])
g2.ylocator = mticker.FixedLocator([0])
g2.xlabel_style = {'size': 16, 'color': 'black','rotation':0,
                   'va':'top', 'ha':'center'}
g2.ylabel_style = {'size': 0, 'color': 'black'}
g3=fig_ax1.gridlines(crs=ccrs.PlateCarree(),draw_labels=True,
                     color='none')
g3.xlocator = mticker.FixedLocator([180])
g3.ylocator = mticker.FixedLocator([0])
g3.xlabel_style = {'size': 16, 'color': 'black','rotation':0,
                   'va':'bottom', 'ha':'center'}
g2.ylabel_style = {'size': 0, 'color': 'black'}








r_t2m_arctic_euroasiaE.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2024-9-21 23:39:04 | 显示全部楼层
好牛好牛,收藏了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-9-22 09:38:43 | 显示全部楼层
加粗很简单
  1. ax.set_boundary(circle, transform=ax.transAxes)
  2. ax.spines['geo'].set_linewidth(3)
复制代码
原图调整标签角度可以自己用经度换算,然后传给 Axes.text 方法的 rotation 参数。不过用 gridlines 的确更方便。

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-9-22 16:01:21 | 显示全部楼层
感谢楼主分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表