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

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

[复制链接]
* y# N3 ~8 _' O- g8 R

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

6 S4 J; \( H- g- D3 A* i

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

5 |; ?7 B1 ^$ w1 H& E. { & u( S5 G# \1 `4 V" d5 ^; a( O4 c

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

% Y8 J- W9 H0 u: P& `& k1 X5 k

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

# U# t/ F) s5 [% U7 G1 C 2 E, W4 P+ h; d# z' i

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

# T+ } L: ~" |! {3 w% U l$ J

①简单常用的填色图:

9 ], q7 V& \) d$ R) ]
import proplot as plot4 t) x4 A5 b/ S7 u4 { import numpy as np ' u" g/ M2 ?4 t6 D) B* f$ ?' }$ D; t; u3 S* u; g # 创建虚拟数据" U$ Z8 Z6 h4 @; G offset = -40 % e- d; M, @% s n0 X lon = plot.arange(offset, 360 + offset - 1, 60)$ c) V1 L6 O$ _+ a# k5 m) \ lat = plot.arange(-60, 60 + 1, 30)) h% G8 c" ]; ]! G: n+ i( l( B state = np.random.RandomState(51423) 4 z. {1 Z7 d/ z data = state.rand(len(lat), len(lon)) % v' ]0 S9 ?& v/ C2 {* u# I! | 8 C, ?1 X* Q) y$ `, w8 ^0 Q" [ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi + G5 ~' b* l( i0 x3 x; U" u proj = plot.Proj(cyl) & o* |& ]1 j0 v+ T+ E& |; d1 W fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)/ w& u7 ?* n" ` axs.format( 4 \! C: Z, U+ W0 W# G( x abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, " g2 o D" V+ [7 \6 @: u labels=True, lonlines=30, latlines=20, O' p9 S# L0 o coast=True,gridminor=True,coastlinewidth=1, ' c2 N& M% `0 w x1 ]3 J suptitle=Contourf,suptitlesize=20, / V: E" N% w" ], `! b+ s rowlabels=[Cartopy example],% o& x9 e5 P/ B, t# U+ t2 v! H collabels=[Contourf, Pcolormesh])/ o0 f: o; |0 c" z cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度4 R2 K7 z: O7 C6 m7 a6 z7 r. G ' `. L6 p7 J! k+ m" s$ b3 J3 | m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)9 F+ o/ U* F# t2 X% X0 L% V+ D" @ axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)$ D0 n% n& f; O# ?' ~4 u8 D4 A ; ~/ Y: E/ u6 a fig.colorbar(m, loc=b, label=State,6 B! `* J* V# C4 x. Q6 c labelsize=20,ticklabelsize=18, extendsize=1.7em) % n, M6 e* B3 L- s fig.save(rC:\Users\59799\Desktop\image.png, 6 o+ j% e8 I/ T' f$ j dpi=600)8 X" f S9 h6 c& S, D2 }, ] plot.close() 5 l. O% \2 A+ X# F6 J1 } d
" _' m, d7 B% x" @' s# H
r) o2 o! b% j- p

②子图特殊布局:

* K3 P/ x1 U+ p0 F
import proplot as plot & w) M' p) ?% D; p6 |& V import numpy as np % a* Y( \" i$ W: O' o p - X: o I0 Q9 o" x # 创建虚拟数据0 n- w7 A! P! O* `. @ offset = -40 ! s$ n4 A( F; X lon = plot.arange(offset, 360 + offset - 1, 60) : i6 }4 T! \; o lat = plot.arange(-60, 60 + 1, 30)& r+ }# ^& l7 z' `* T state = np.random.RandomState(51423) W% Y/ x- j" a1 t& _6 Y% y data = state.rand(len(lat), len(lon))* A# Z6 {( q- G 8 s Y: q) ?4 Q8 p9 ~+ I; ~0 V! v * \ [4 G4 O. p* w. Z subplot_array = [[0,1,1,0],' [, E8 i% E+ N3 u+ N( i6 p" H [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...) D. ?! K7 C6 s+ w ) _' Q/ L: o% F7 j9 ]" B" H; C plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi( ~1 i- i- }/ Y/ {7 V4 Z3 ? proj = plot.Proj(cyl) 2 [$ B1 G) j. r+ g" j8 K6 b fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) $ l) H& U8 \8 l2 Y e4 u axs.format(2 H7 B; e; x& f. C2 E2 u abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,: @8 e* Y" E6 s- ^6 [/ w# \ labels=True, lonlines=30, latlines=20,( o+ ^* {! |3 L) Q; Q& S3 H coast=True,gridminor=True,coastlinewidth=1): k6 ]& Z6 y' O8 |/ k& z* N$ i6 R cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度4 w2 X" t7 [1 X1 n9 d7 t 2 ^% e1 W, T# L m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 0 L# |9 J3 s) _) E+ d axs[0].format(title = subplot 1, titlesize=20)4 K( H5 }& U8 N' ?5 U * n) h E! b, j. i1 l( x axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)0 |; t8 T0 f2 E& e- A, |2 V axs[1].format(title = subplot 2, titlesize=20) 1 V2 h! Q* o# w% C 3 v0 r4 J! N4 m& d* c! z7 q q* E axs[2].contour(lon, lat, data, extend=both)4 X- j; p$ f" d; b" q axs[2].format(title = subplot 2, titlesize=20)$ `5 z8 l' {8 N, j) | ! n+ H- b* Q' C G5 p+ ]. ^ fig.colorbar(m, loc=b, label=State, & t" x' [# a" ^% c7 l# S6 m c labelsize=20,ticklabelsize=18, extendsize=1.7em). g* G# v) M4 y" m2 w fig.save(rC:\Users\59799\Desktop\image.png, A$ k/ ~) s- G/ s4 l* Q dpi=600) 0 J# g8 l6 W2 C% E2 T plot.close()
3 e: \+ ~* z3 E7 {
4 s" m8 b/ y U( r8 q9 o

使用技巧:

0 Y5 G- d+ ~5 ^

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

- N0 M8 o$ G |5 X$ w3 H! L& C- ^

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

2 e0 d. O9 G( _. ?. v8 Q
axs.format(...)#设置全部子图/ T. z3 I- D. s4 W6 q axs[0:2].format(...)#设置第1张和第2张子图 ' J. M9 l2 X/ B% R) z axs[0].format(...)#设置第1张子图
% s5 R, S6 f0 M% K5 a7 P; v8 F) }2 ?

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

& \! y2 F' o* V% U

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

. a1 z: c8 t I 0 x, M' L. x( \* |" O, B, V: s& ^0 u 5 i/ S, n7 S( Q7 |% I+ m6 N" \0 L; e+ {) E5 m % o8 h( ^1 p. {/ D: w
回复

举报 使用道具

相关帖子

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