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

[复制链接]
~. s$ X# Y$ U6 d. S

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

9 }3 J' A: Y2 e% g

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

: D5 M- G8 }4 {# L% ]! U 1 u4 d N/ d6 F0 R

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

2 R2 E# \' y |7 F# {. @+ |

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

8 H& S* r5 ^. i& P- b1 b4 w* W 0 j2 w3 X+ O. x

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

0 H }4 f! K L

①简单常用的填色图:

6 H! Z( c+ _7 d! s7 M
import proplot as plot 9 j4 ]$ C5 P$ h- h6 F import numpy as np , p( G" A/ L/ C/ I5 \' K; ^5 R1 }+ Y1 y2 d- C4 q3 O9 W # 创建虚拟数据# X" i, P2 v _! G6 ^- R8 B) G1 U offset = -40 u; J" ^& s1 l* ?( |6 c. Q6 E+ G lon = plot.arange(offset, 360 + offset - 1, 60) # {4 w4 M3 P/ r- q lat = plot.arange(-60, 60 + 1, 30) 9 X% h: n9 E3 Z: A! [( J' b state = np.random.RandomState(51423) " r; T+ {& {0 t( c+ j, L& e data = state.rand(len(lat), len(lon)) 9 X) H& c" y0 ?' }8 @& h% }% r$ _- e9 a" V3 J/ P) N0 m o plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi1 h d$ C/ @7 S5 o* A5 K6 ^ proj = plot.Proj(cyl)6 S8 q/ ?$ R' `& D% H. K2 }. s fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj), x3 F& M9 x: R( L# p1 s( d& | axs.format(# y; o8 c5 O; F abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,3 @: H. I+ [' `1 x8 m; @: G labels=True, lonlines=30, latlines=20,: m7 }0 t3 k( B3 y6 m coast=True,gridminor=True,coastlinewidth=1, 0 N J3 n, ?) i suptitle=Contourf,suptitlesize=20,+ a' `9 o" Q( j rowlabels=[Cartopy example],% K8 \! M$ l8 h$ }6 } collabels=[Contourf, Pcolormesh])/ B- S4 F5 o ^0 f cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度" O4 t. a0 D R) `) B- f6 b Q3 G' [! K' F$ Y4 p1 F; T! J1 C m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) ! |3 D% X! v- h- L G. m axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) # \" g- J0 [& P9 e& b# n: H2 }+ t+ D fig.colorbar(m, loc=b, label=State, $ A' \' S4 V! G. \: A( x: U# J* M labelsize=20,ticklabelsize=18, extendsize=1.7em)' |1 T0 C: O7 P; a/ @- ] fig.save(rC:\Users\59799\Desktop\image.png,3 x" P2 `# c0 Q dpi=600)( l, N7 \4 p0 A1 t8 I plot.close() W& ^ e3 P% m' `
5 U2 S, ~1 ^* Y3 S) d
; y& Y5 \% p" O- J6 B8 L/ W d

②子图特殊布局:

8 I- n& W; h# E- {* Q8 _5 n( Z
import proplot as plot T1 E4 D" g. b# M+ N5 ] import numpy as np$ G7 B6 w2 U9 D + @/ l3 ^8 L5 {+ U8 Z # 创建虚拟数据 ) O# E1 w8 ^* }% H% \ offset = -405 g) j* Q- u( ?6 D' {! N1 J lon = plot.arange(offset, 360 + offset - 1, 60) ( W. u1 Z" I5 c$ H1 Y& \% v' q lat = plot.arange(-60, 60 + 1, 30) 1 I; w2 Z. m0 x& T8 ?. z- o1 T$ b state = np.random.RandomState(51423) 2 s4 W% a/ ~2 P1 B2 z/ J1 G5 p) e data = state.rand(len(lat), len(lon)) + R: D' M z' z$ A4 a* c5 h; v+ G+ | 4 M {! r* e' {; a V subplot_array = [[0,1,1,0],9 d/ v% z. `* z0 y8 q [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...- p% ~9 B. v7 A- o, }. @5 T1 d" U 5 P- K& }7 z3 ]1 @7 W/ J- f5 B plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 1 q9 @, m3 j: @1 |. R# G6 p, m proj = plot.Proj(cyl) . r; e, M: W( ~. X fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) 1 n7 K( `* {9 S" l. { axs.format( ; Q$ i; M q( [ abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, - ]: c0 G( X* X- K labels=True, lonlines=30, latlines=20,4 D: w0 \9 M0 d: G1 |2 t coast=True,gridminor=True,coastlinewidth=1)# C) G+ N/ K- e# n# Y5 E cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度) d! k" R; N( \9 N1 ` ! h9 [% \( A$ f. O$ F* A3 A m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)% Y/ k) W) N' r6 ^. B/ e3 d; ?, _ axs[0].format(title = subplot 1, titlesize=20)! X" \. b. {& M6 o+ q 4 N2 h6 J' U+ U! x3 R; Z+ P7 ? axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 8 f0 M) K" ~8 c4 q: b& N8 r+ v axs[1].format(title = subplot 2, titlesize=20) ( e3 F! N' J2 K* X5 a% T! ~) D3 s( G1 e- w" ~ axs[2].contour(lon, lat, data, extend=both)* ?! a& `5 V/ G axs[2].format(title = subplot 2, titlesize=20) % n, l* ]) z6 ` 3 U( F; \! N( D) K- ~( S: j fig.colorbar(m, loc=b, label=State,( \9 u! }3 Y- Z) Y+ k, R labelsize=20,ticklabelsize=18, extendsize=1.7em)/ @1 v- ^# a0 p" v fig.save(rC:\Users\59799\Desktop\image.png, / L: r6 H$ S1 V dpi=600) + L( p3 o7 k+ @& V9 l) u, b plot.close()
, b9 B0 p5 Y6 f; Z5 Y8 S7 b
C3 K8 k& i2 F

使用技巧:

" M/ V6 P+ p& b/ u

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

$ u6 `0 j# y! ^1 J; U [8 z

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

9 C& k; y. X6 N2 M( I
axs.format(...)#设置全部子图. u" L/ X! [( W2 [' }' f+ P3 D) m axs[0:2].format(...)#设置第1张和第2张子图 1 H$ t( C3 | T2 r- B/ q! d2 o. d+ m axs[0].format(...)#设置第1张子图
& A- x9 j' w5 _' Q5 k' Q6 o6 O$ ^9 L& u

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

7 B! N8 i1 q% s

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

; Y* z- s2 Z U; o" ]/ p9 ] ' A' }1 P4 d* N6 v: V/ k1 F+ S/ ~; \% d/ f: B' ?) K - R% w' H" p! O/ L% q6 N% N 7 V1 R" }( t+ b7 T/ @" N% X
回复

举报 使用道具

相关帖子

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