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

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

[复制链接]
5 T4 I! e0 t+ Y; R4 _1 i

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

$ c) k8 `4 T; @

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

2 `& Y1 A2 n5 {- j* F% A. d b- H7 C 1 e0 b* z4 A. ]

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

/ g1 s% M2 Q4 I: Z/ N

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

5 U2 |' [ b4 J1 N- J" L9 s: W ' h+ N5 r, ^7 h: ]; m( c& R

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

3 k) U2 R ]# g9 l

①简单常用的填色图:

1 n# L% w" V. A; n. }
import proplot as plot: f( o3 B) b( t% }2 B0 _ import numpy as np % M0 {% v: T# V9 i, r4 p3 E% Q* d6 B# S0 [ # 创建虚拟数据 6 m, E9 N8 H( G offset = -40 + ~2 A' p+ ~2 K( @ lon = plot.arange(offset, 360 + offset - 1, 60) m0 U" x7 ?* v' ] lat = plot.arange(-60, 60 + 1, 30) ( x7 D( P8 B7 Z3 H. k1 G( |# C state = np.random.RandomState(51423) 8 T" h! w5 i. b4 d9 C data = state.rand(len(lat), len(lon)) : b6 L4 r% `; G/ M! V % q9 c. I7 l+ y3 A9 B3 X {9 ?. X plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi K/ m$ E$ E0 f% o- f. { proj = plot.Proj(cyl), y4 M( D; F- Z* D- @" B# @ fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) / [4 c" q# W% F& t/ x axs.format(: p# \. H& q5 V) D+ Q. Y# L abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, " N/ V7 ^" |9 t+ P' {+ ?; n labels=True, lonlines=30, latlines=20,2 G% ~2 \6 X5 \8 K2 I; U coast=True,gridminor=True,coastlinewidth=1, ; o w7 f+ Q" e: w# h0 T" K suptitle=Contourf,suptitlesize=20,! {- ~* ^' C, r8 \5 F) L l: V rowlabels=[Cartopy example], 9 M5 D* n0 B" y: A/ o2 N$ B; o collabels=[Contourf, Pcolormesh])- N. C2 B7 T9 S5 h" i: g cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 5 q0 m; i9 `3 k4 r. z8 { ; N* _7 x0 t8 i- W4 z! |7 e m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) ) Z$ _/ y+ X9 W' l axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)& @3 `$ E# P* p 6 z3 w+ L3 l/ g: h" C fig.colorbar(m, loc=b, label=State,! v* u/ m# b: ]# D" @ labelsize=20,ticklabelsize=18, extendsize=1.7em). v: K- Q8 P# F; N2 y: l fig.save(rC:\Users\59799\Desktop\image.png, + {* t* W4 ?1 j dpi=600)3 i: ^5 U4 d! h: F0 x" w plot.close() - @7 m: \( {& I- k6 Z7 I* D+ ?0 K! [
8 B/ B; M3 g! O! u* \
( t4 V) D1 h5 s |1 R$ {: y

②子图特殊布局:

+ P9 o4 S% H. M$ A. J, h$ m
import proplot as plot 8 G4 U8 ~; E: E. z' i H1 M import numpy as np! i3 m% C+ n" N& T. D/ G8 A 3 o! y; D; N8 S4 ~" Q$ p # 创建虚拟数据/ X3 c- b$ o1 e! N+ ~ offset = -407 e: n, r& c1 a0 K, D# {9 N: j# ] lon = plot.arange(offset, 360 + offset - 1, 60)# i7 D# j: |0 t0 C lat = plot.arange(-60, 60 + 1, 30)8 I, N7 C' f0 Q- c state = np.random.RandomState(51423)& Y T$ Q+ Q5 s) [$ d" c data = state.rand(len(lat), len(lon)) 2 k+ d& p) s9 I* V8 S! n 5 P) P2 J# {2 }+ d ) K# X6 v; @5 f8 Z" V( Q* S9 S" L subplot_array = [[0,1,1,0],; F! _' ?5 j6 Y5 n+ u [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...9 p( J8 n9 `9 f: [1 x7 G 8 } m Z( `! [: ]+ J( L plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 2 s O$ H8 M& E* U5 A9 w5 J# X8 F( v% B proj = plot.Proj(cyl); \! M; A: F6 S6 H8 Z- P- h" w9 l fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) 9 O, S: g2 x3 f# F* F3 H axs.format( . ?0 {7 o! y& M/ ] ~8 Y2 X abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,7 _+ v8 w+ F, k7 I3 S! Y: X labels=True, lonlines=30, latlines=20,$ V" h! Z$ L7 w! p* Z/ j4 R coast=True,gridminor=True,coastlinewidth=1)# `! u% m: y o/ J- O cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度7 b, d' a& G1 l4 Q3 n- ] 9 M9 @: W1 E* K m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) - f6 i" a, s6 o2 t) Z axs[0].format(title = subplot 1, titlesize=20)* k1 n. G2 L7 d6 W' G # U: E. w* {& A7 o0 m, D axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) * F% H1 O; z. s, r" W axs[1].format(title = subplot 2, titlesize=20) ' j7 e9 y8 ~$ N- d. e! q+ Q7 o/ g, U& C$ R. d axs[2].contour(lon, lat, data, extend=both)5 M, n0 [7 Y7 z$ Q$ M axs[2].format(title = subplot 2, titlesize=20)5 x9 H3 y% s+ v, ^& `) F9 M 8 t! I3 R+ m: c! x k( j4 v5 U+ Y fig.colorbar(m, loc=b, label=State,+ Z3 N4 G$ O6 Y5 V! ?! J labelsize=20,ticklabelsize=18, extendsize=1.7em)- L- h: y! P* B2 \( R fig.save(rC:\Users\59799\Desktop\image.png, 1 L* i9 X4 O8 \3 Z- F dpi=600)$ m$ J) E' K( c1 Y plot.close()
- C' r/ E6 T) N M! d; F6 h
) Q8 }2 d3 R! i" T6 W* m

使用技巧:

3 S: T. j: G- R

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

) D7 G7 `: t% V; Z6 s

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

c" Y3 u! s {$ q0 v! _
axs.format(...)#设置全部子图 Q- ^( }6 A4 `( h6 {/ {0 Q% K2 @9 k axs[0:2].format(...)#设置第1张和第2张子图- f. v. {2 g% \0 C' I7 Q8 {( _( i axs[0].format(...)#设置第1张子图
. @( U. R2 k1 O$ z

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

, |" i2 }+ G5 n ]% v' Z9 o$ z

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

1 S3 H3 ~% d( M3 \' |8 n2 A b) u6 \# L0 p" z1 U) A % \: o9 a. H. F* L& n7 y/ s+ |& ?% D+ U- V + Y7 A/ R6 r& P
回复

举报 使用道具

相关帖子

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