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

海洋数据处理软件 -海洋数据分析收费标准

[复制链接]
% U$ r5 A% {& U ~( V5 [

Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。

* J$ l7 g/ @5 E _- B

在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门:

# o! M! `1 t5 z 1 {8 L$ _& {9 w3 i1 Y

不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。

4 U0 A0 q1 `5 V

一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)

" C8 G& i. A# o7 I, ^ \ ) _. ^: r9 m% x* @

在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果:

g" T+ j4 U; i) r$ ^4 p

①简单常用的填色图:

1 [1 |" d, }$ V2 {; F
import proplot as plot ! I' \, @1 j/ a* @ import numpy as np 5 ^. E# [% i) J( I1 Z# G) C2 v) B8 K1 ^ I6 S+ b) R6 d # 创建虚拟数据( _$ [2 U% G; S5 {( ^8 ?, t7 c, e offset = -40# L6 @- L& k& I4 w lon = plot.arange(offset, 360 + offset - 1, 60) 9 w! g; M' E$ K# V lat = plot.arange(-60, 60 + 1, 30) 9 i" P, A8 L6 g* y9 O) O* T$ b2 y$ g state = np.random.RandomState(51423) - q3 I. d- P+ Z- T9 o. p data = state.rand(len(lat), len(lon)) ' O+ g7 C" n0 c9 X / h, O5 N+ I4 \3 s' h: q% e plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi9 t, K: r/ w) y* X; }" r) J8 w. M proj = plot.Proj(cyl) 7 h! [8 i' `! f fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)) x4 Z( l! y! N$ P7 l axs.format(0 I$ o2 a" d) g* e abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,7 I, E" F, u/ g e0 T6 ?/ F labels=True, lonlines=30, latlines=20,9 _/ O$ u/ s% w% b6 L coast=True,gridminor=True,coastlinewidth=1,& f: m" I0 K+ v& y5 N0 J" x suptitle=Contourf,suptitlesize=20, & R; _ T+ \" a( K rowlabels=[Cartopy example],- J& L+ S+ N5 J5 x9 {! k collabels=[Contourf, Pcolormesh])6 W( d- e) _. [. E+ o, k9 N cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度9 H+ e, [3 E' C- ^" v% v $ k& ?/ |3 T5 l$ ^- e. y n m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 7 ]9 C" M% v0 d axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)* _* s) s1 k5 @: m& T/ t# C + c' D9 u2 E, u& _7 Z- d: Z0 _ fig.colorbar(m, loc=b, label=State,- ]7 [& R- }1 T0 a9 J9 g; v; ^0 Y labelsize=20,ticklabelsize=18, extendsize=1.7em) # u7 s3 K5 U7 u4 B8 N! [% p e fig.save(rC:\Users\59799\Desktop\image.png,- ~) ^5 j2 m" M* L* V7 N1 h+ ? dpi=600)' I1 H S/ d% V- j plot.close()1 _0 o0 F+ W$ p9 \" o
* o- c, q8 ~: E1 f6 W8 N
: U) W. `) n8 p9 m

②子图特殊布局:

8 g+ n; ]0 ]! s. f$ n
import proplot as plot% n7 |% R2 A/ U import numpy as np" u9 a% _# a4 T1 I ( K: T x. E8 ^& C # 创建虚拟数据 ! x3 ^% d8 l; s5 t5 I offset = -406 j9 t7 M, V8 V( t6 w: f1 Y lon = plot.arange(offset, 360 + offset - 1, 60)4 N5 Z, t: x; w1 |# U$ l lat = plot.arange(-60, 60 + 1, 30)& _' @1 r; L- ?6 [) m state = np.random.RandomState(51423) 7 g. h, S% M0 O' _6 N$ Z! D" u data = state.rand(len(lat), len(lon))! W+ ]" r- C9 i 1 S2 }; c2 m O b9 F+ f * r: B+ Z" F1 A0 f8 R* {9 p subplot_array = [[0,1,1,0], ' P4 A$ y. Q& o, P* f: q0 g% W [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...0 z' X+ \7 {$ T `# ]" h: w : L7 Y+ ^, T6 S' h' L' x8 ^ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi% x$ ~3 |$ }5 e( Y proj = plot.Proj(cyl)6 _, A/ a! f5 _0 e fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)% ]; c8 j/ j" {3 Y( u) u# Q axs.format(0 q) c! p+ f5 p abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 4 n" c& d. ^' Z! W) F& \6 ? labels=True, lonlines=30, latlines=20, , S" w0 v; Q- O coast=True,gridminor=True,coastlinewidth=1) + w$ T7 [4 V4 n7 _0 C/ ] cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度& Q7 S2 ]6 `9 h9 d6 H f+ J ! A+ K7 `0 ^1 K4 ]' w9 N m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 7 I3 J/ l6 Y- F+ ^ axs[0].format(title = subplot 1, titlesize=20)4 h2 U# M4 @( |. K3 n& q. W % a+ Q. r' ^9 H9 Y axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)' D; x3 r" w, a: b axs[1].format(title = subplot 2, titlesize=20)0 Y5 `% I0 u ~ 7 D9 l' R3 H* F% Y! M axs[2].contour(lon, lat, data, extend=both)$ O% t$ k) z/ _; ^4 f+ m$ P axs[2].format(title = subplot 2, titlesize=20) 2 {0 S( p. q% C" ]# c" @ 3 f. r D( _& F" P& I$ f fig.colorbar(m, loc=b, label=State, 2 l8 O z, A0 \( K/ y: J labelsize=20,ticklabelsize=18, extendsize=1.7em)4 v; \: E7 N9 c+ |$ q fig.save(rC:\Users\59799\Desktop\image.png,( z4 u! d5 B' U dpi=600), N9 ~9 B! \3 S) S plot.close()
! I* W$ v) r2 x6 z7 e6 o& a
3 ?5 c" z; n9 o" S& ], \

使用技巧:

& R9 O; j# {7 V, a% B: U

①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。

r" a! [; x, M

②format方法可以针对不同的子图设置不同格式,例如:

& e5 {+ d3 p8 y( I
axs.format(...)#设置全部子图6 h& U! a+ h! I6 } axs[0:2].format(...)#设置第1张和第2张子图3 E1 A6 u; ^! s# w2 e: |0 D) K/ T axs[0].format(...)#设置第1张子图
/ ]7 `. D2 R1 g8 J( l( \

③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节

9 l+ h2 w: {4 o4 x3 E

④现在Proplot中还包含着basemap,个人不太推荐使用。

2 {& a8 d' y7 p5 ]0 ~* } ! L0 W* \* z% c1 ` j: R0 X6 ^ L1 o2 i( \9 ]6 q+ m, G E % N9 l; I. b+ B# S7 z) h! R. N; H / W3 r7 t" f3 [# b7 r; a5 _
回复

举报 使用道具

相关帖子

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