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

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

[复制链接]
( h/ I: ]8 Y4 U0 v$ n9 y

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

8 Z: q9 k# y3 m. H" F# s! f

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

: g1 C; i8 D$ t( ?8 G7 u: q1 \ , P' ~5 e, b6 G, j

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

. o% r8 h; K; i, h. b8 T' h

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

. f, N$ y& p, C& \5 ^ 5 W: q% }9 ~$ u/ [$ F: O

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

, f/ K! b. Z. ^! V& T5 e+ c

①简单常用的填色图:

9 z! ]# e+ l' C- k- W
import proplot as plot 1 `* }3 i' h! S7 l! M import numpy as np& @7 L% g6 q5 X- t1 h) ?+ o' Y6 A + X0 S8 A5 k9 _9 q, |/ z5 u8 ^ # 创建虚拟数据, z( K. P0 }) i+ C offset = -409 c3 C5 g2 H5 b. u+ h lon = plot.arange(offset, 360 + offset - 1, 60) ) p1 c% |% K" M6 W* W+ [8 }; y& w lat = plot.arange(-60, 60 + 1, 30)- o7 D! h$ z, S9 Q& z state = np.random.RandomState(51423) " Z) B3 A. s3 [. d% A( L! T: c data = state.rand(len(lat), len(lon)) + L6 r K$ h4 J/ E' e. V" K9 h' v . L/ a9 \3 b$ z/ | plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi" c( W6 T, I6 u3 F' Z proj = plot.Proj(cyl) % O$ T1 A2 Y, ? D. C' s( F fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) 6 q& f2 l8 [. Z6 t6 T axs.format( ( q3 Z8 L) B( b' K$ X: F abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 9 b4 [* E4 c4 A labels=True, lonlines=30, latlines=20,$ t& S+ V* B2 J coast=True,gridminor=True,coastlinewidth=1,3 S4 D- N. V1 B+ w( y) F suptitle=Contourf,suptitlesize=20, 5 e" K8 \* U. u rowlabels=[Cartopy example], . b, _2 e* z; g h' N collabels=[Contourf, Pcolormesh]) 5 }5 ]8 h, y p cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 2 B L: N' O( \2 f: p" i+ W2 v" v8 X m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)& I" [+ F; @: b9 F! I. b1 n axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 2 I4 ^, Q- H7 R9 o/ ~' z2 T; C 4 J1 [% |& |- O* T1 c) S$ M3 l fig.colorbar(m, loc=b, label=State, % H3 i2 u) H; @! o; t labelsize=20,ticklabelsize=18, extendsize=1.7em) 0 ]3 ~( w9 E! Y) k8 Z; S fig.save(rC:\Users\59799\Desktop\image.png,( p0 O5 z1 {5 D, [& `* Z dpi=600)/ ], L- i6 C) c+ Q plot.close()$ {( f6 h" H7 _
- b- u" R1 x4 L0 ]2 G- }
1 i0 x, z; ~; _/ F

②子图特殊布局:

# k% U. Y3 F8 c9 U( | V0 G0 b
import proplot as plot3 w- B7 l" ^# \3 w' X% L- q import numpy as np& o: c. t# J8 ]: A / ?, C% a) Y9 N. Q0 M # 创建虚拟数据3 ]" v4 T& `4 E' d+ C9 t offset = -40 0 Z {& J$ H6 Z) o' ]6 K lon = plot.arange(offset, 360 + offset - 1, 60) " ?6 I4 s5 P1 G! l8 {, z1 z lat = plot.arange(-60, 60 + 1, 30)# |% F" t! q6 V state = np.random.RandomState(51423)' s* B% P* y& v% ]0 ? data = state.rand(len(lat), len(lon)) v5 G; P$ E" ^0 ]" w* m3 {9 d/ e7 W. r! X( _* I; ^ d8 q3 w' x `& e( ]& ] subplot_array = [[0,1,1,0], * i: d) u+ t6 n9 x [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3... : y* i5 q i1 T, t& p1 H% q$ t6 U& _7 e0 v plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi5 z/ H6 F# C# ~. j4 q# I' p proj = plot.Proj(cyl) 8 _7 p: {4 s" T/ Q4 I. R) { fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)/ ~" ^, h L& |6 C4 \ axs.format( " ~$ }* J9 |& { abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,( o$ w6 C' [$ A8 q" x labels=True, lonlines=30, latlines=20, - g0 h' A2 I6 t coast=True,gridminor=True,coastlinewidth=1)9 D+ G3 d. h- P/ f5 L5 I cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度; C2 g' W: O0 p0 l$ I + d6 N0 _5 S1 i, j: G m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 1 K" d; j. {9 }* `7 q axs[0].format(title = subplot 1, titlesize=20) 9 Y6 |% d# x+ t5 r" h, k0 K, f: x, q; M1 S! T: L8 W/ w axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)! i: t( c. S& v# O, q axs[1].format(title = subplot 2, titlesize=20)" Y9 s2 g! Q: ~, V+ Q- E5 V ! A9 z7 P: ^( [$ h$ v; N axs[2].contour(lon, lat, data, extend=both)6 i: b( _7 [4 G! G; D! ] axs[2].format(title = subplot 2, titlesize=20)( U. R7 }, r2 k# K6 C * l# q ~9 q) ~/ O3 C fig.colorbar(m, loc=b, label=State,* {+ b# D$ |5 r" }' z$ u t labelsize=20,ticklabelsize=18, extendsize=1.7em)% R+ l+ _( R" X0 x; R fig.save(rC:\Users\59799\Desktop\image.png,, ?9 ~, M- M1 g, @! n dpi=600)& D. {1 E" e" L" T5 y plot.close()
1 e+ Q e8 W# h' E
0 a6 s' {5 T2 D6 v. J1 b+ k% M( Q

使用技巧:

7 \1 |3 J- ^3 c' C9 H6 ~9 q5 S

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

" z: P% R5 }8 T1 w% H% b4 D8 U. e+ L8 ~- x5 L

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

1 R# F. O2 E% Q% @; |
axs.format(...)#设置全部子图& @; I2 g6 x6 @' b axs[0:2].format(...)#设置第1张和第2张子图 # e* W3 {7 f! b& a& Y# R3 | axs[0].format(...)#设置第1张子图
2 R s$ ?& g) Z; @: }$ q

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

; t& ]. a/ u: k! J- v6 }- p

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

" B# Y' c5 b0 i2 T ( F3 i# ?2 q$ U' d 9 D. O" w. U/ ?6 b1 { , u) y4 |6 l6 p8 }( y ~4 @6 ]/ {! P; h: S( ] E
回复

举报 使用道具

相关帖子

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