收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

零基础小白python入门必看之Cartopy的基础使用

[复制链接]
4 I/ r6 V8 }: T- E1 Q

文章目录

前言一、基础介绍二、区域地图的绘制总结

前言

; [" @3 X) j& e7 A: }. }8 I

常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开发维护。故简单介绍cartopy模块的一些基础操作。

- ~, K/ u9 J! l- z4 v$ V
6 U2 k, O, e9 V0 \& k3 V2 q! H

如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python,关注小编,并私信“01”即可进裙,领取python学习资料,会节约很多时间,减少很多遇到的难题。

% q7 Y8 a) S% ?

一、基础介绍

- ~& [2 D1 `/ k7 ^$ z6 o

首先导入相关模块。

import numpy as np% m+ B% B+ A- ?+ s' Y- j import matplotlib.pyplot as plt : q" j5 f. w* K; ^ import cartopy.crs as ccrs) e. \3 D. U+ A9 L import cartopy.feature as cfeature D5 I: f7 b+ q* [8 g' K5 H from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter ; J& @/ C" f4 m+ a( P# T 12345! G1 x+ O. Y% F

首先介绍参数projection,该命令可以配合ccrs设置投影类型,此处以方形投影命令为示例。其中central_longitude参数为投影中心位置。其中心设置与Basemap设置规则一样,详情可以看上一篇文章。

ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=0))# E: R0 f7 g6 ~* s( B 1

在设置好绘制类型后,绘制地图各特征量。其代码如下:

#ax.add_feature(cfeature.LAKES.with_scale(scale))% z% b- t2 {% u ax.add_feature(cfeature.OCEAN.with_scale(scale)) " F+ H9 [" k! i( X- c& ^2 M# Q #ax.add_feature(cfeature.RIVERS.with_scale(scale)) # S, E4 v% W/ A. i$ \ #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)5 u( M" ]% n2 Q ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) / |5 ~- d. K/ w) k: |% ?" ^. O 12345 3 z1 q2 M3 J# s s6 _

参数scale为地图分辨率,目前支持10m,50m,110m,参数lw为线条粗细。此处绘制海岸线和海洋,效果图如下:

$ R5 @4 O- a: Z1 S$ q5 x3 ] % ?: j$ f+ J# N3 G, R
$ |. K1 Q v9 f* z1 p3 a

在绘制结束后,作为地图。经纬度自然是必不可少的,在该模块中,引进同时设置坐标轴标签改变该标签刻度的表示,具体形式如下:

ax.set_xticks(np.arange(0,361,40), crs=ccrs.PlateCarree()) + n9 d! T% N8 u6 Z! ^1 U ax.set_yticks(np.arange(-90,90+30,30), crs=ccrs.PlateCarree())3 b- j0 T; W' H #zero_direction_label用来设置经度的0度加不加E和W X' K$ t" l" O, Z; a$ S3 l2 t lon_formatter = LongitudeFormatter(zero_direction_label=False) ' u8 a( @5 P8 i9 h6 o( Y lat_formatter = LatitudeFormatter() * ?* ] p% U( w* Y8 e ax.xaxis.set_major_formatter(lon_formatter), R" e7 P( [9 M ax.yaxis.set_major_formatter(lat_formatter)3 j8 j: G: Q+ S. C 1234567

可以看到效果图如下:

: o2 I% R7 K! J/ X+ o( N' j5 Y ! {5 Y% `2 g* ]) a4 h1 ]* R
- V$ l$ ]. g/ {/ j; d/ i8 X9 O* \

当然如果想对坐标轴粗细变化可以引入一下命令。

ax.outline_patch.set_visible(False): r! v3 g. Z. y7 n% t; W( w0 R8 d ax.spines[bottom].set_visible(True) 2 l+ n, L, e4 \% Y# v ax.spines[left].set_visible(True)4 E/ w& c/ r) e1 s! D4 F2 c ax.spines[right].set_visible(True) 5 H! o$ d1 m- V9 U2 ] ax.spines[top].set_visible(True)& U" r6 x# \- O. j* u# M3 | ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细 9 o8 Q/ A: N+ N3 }/ L$ N9 Y ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 $ K7 k9 Z" k0 B# a2 o ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 5 D" h7 w1 }/ J- l6 s ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 2 G) `: R. ]- K- x7 x8 E2 g% u' W/ ?1 {8 K, A# [- G 12345678910

应该在该模块下,控制坐标轴的命令已经和常规不一样。因此先关闭该控制,然后开启常规坐标轴设置。

( W' C4 B& K! u

二、区域地图的绘制

* X0 k( C6 [" b9 m# G8 O+ h

当我们在某一小块区域研究时,需要绘制区域地图。此时我们可以引入命令:

ax.set_extent(box,crs=ccrs.PlateCarree()) . V- O& N- R0 _' f* J1 A* P 1& V K% x8 u3 l

其中box为绘制区域,crs为投影类型。其他命令基本不变。设置box为[40,180,0,90],可得到效果图如下:

5 k# m# }: x: I6 [- y: D/ U5 F! h! u( h1 g$ v% K! ^ L
/ |5 D% V( h; h7 h

总结

# |2 U F. g* w$ \2 Y( F9 P

为方便各位读者,我书写了绘制地图的函数,大家在使用时可直接调用。此处示例为方形投影,若希望绘制其他投影。只需要修改函数部分参数即可。代码如下:

def map_make(scale,box,xstep,ystep): 3 [3 R, ^: x' m5 R+ H* V ax=plt.axes(projection=ccrs.PlateCarree(central_longitude=180)) ) }7 d; L/ P" Q a = (box[1]-box[0])//xstep3 m* @5 y6 J# Y x_start = box[1] - a*xstep 3 O5 J# Y4 E* h" q6 ]. d- g a = (box[3]-box[2])//ystep * r; G, U* c4 b( R* G- X! Z y_start = box[3] - a*ystep2 ~8 t* A) B3 t; m& s; W6 O6 U ax.set_extent(box,crs=ccrs.PlateCarree())! x, t# _ E, L, l, t7 E5 L #ax.add_feature(cfeature.LAKES.with_scale(scale)) 3 S) ~% u$ H6 s" `( G# k #ax.add_feature(cfeature.OCEAN.with_scale(scale))" y! i i' l& y# }% c# E2 X #ax.add_feature(cfeature.RIVERS.with_scale(scale)) % x# T) O2 G& y: j #ax.add_feature(cfeature.LAND.with_scale(scale),lw=0.5)8 P5 I x4 O/ b6 h ax.add_feature(cfeature.COASTLINE.with_scale(scale),lw=2) ! Y; h6 [+ s8 t' O- W% m$ p: k& j1 i. a4 E2 k ax.set_xticks(np.arange(x_start,box[1]+xstep,xstep), crs=ccrs.PlateCarree()) * ~9 K" u, ~3 P7 p ax.set_yticks(np.arange(y_start,box[3]+ystep,ystep), crs=ccrs.PlateCarree())% I3 n5 ^; [" k" `& M0 c* Y #zero_direction_label用来设置经度的0度加不加E和W8 G) B9 V K. K lon_formatter = LongitudeFormatter(zero_direction_label=False) / T3 V9 d/ r8 O* m, h; e2 u lat_formatter = LatitudeFormatter() # Y. Z1 g& U6 p, h+ Q+ c+ {9 W ax.xaxis.set_major_formatter(lon_formatter) " O* B8 C; V/ ]9 T6 U- ^9 f1 Z ax.yaxis.set_major_formatter(lat_formatter) 8 ? `* e* V* H6 A, ?: a #添加网格线 6 m; B0 I* W3 t3 f' ]; Y ax.grid() . A! |/ J% s: S k2 ~- _ # T# M e* d0 Q0 M ax.outline_patch.set_visible(False) / y1 r6 h4 r: b6 ], O ax.spines[bottom].set_visible(True) 1 G5 c) K ^+ p: y. d ax.spines[left].set_visible(True) v, e( }3 X! p0 J; J* e ax.spines[right].set_visible(True) 0 H3 ^# B# s8 N; I" @' z ax.spines[top].set_visible(True); [" @5 K/ N5 T9 ?& }9 o' A( T% I" O ax.spines[bottom].set_linewidth(2.5);###设置底部坐标轴的粗细! {+ `6 q4 Q- e; F& C ax.spines[left].set_linewidth(2.5);####设置左边坐标轴的粗细 9 w, E9 C/ j2 B0 p( r ax.spines[right].set_linewidth(2.5);###设置右边坐标轴的粗细 N. U# u1 B% A1 w1 x [ ax.spines[top].set_linewidth(2.5);####设置上部坐标轴的粗细 1 d$ m& V3 m9 x" ~. q7 [7 f) m" d1 U; f& v9 h4 H return ax

最后多说一句,想学习Python可联系阿喵,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以关注阿喵,并私信“01”领取。

* u- p3 ?7 v b % {) J) \* Q$ Y l, I ?2 L. R ) E7 P5 W) j" o2 U$ D1 N" f . ^ x7 ^8 k6 p" ]8 m2 j! B6 W, Q( N' E" v; C
回复

举报 使用道具

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
大狼
活跃在2026-3-25
快速回复 返回顶部 返回列表