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

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

[复制链接]
7 Q# n- A2 ]2 [3 f

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

5 @! \# y+ e: g4 V6 K6 w8 ?5 w

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

' Q8 e( k6 }+ T5 m # k2 E0 g7 T, }6 C" ]

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

" j3 G Y7 V4 Y4 E- `. n% ?) b* s2 b

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

/ i& V7 G4 C- f: [5 z& s; z 1 `+ ~" N" t) j) V- E. ~9 J9 E

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

3 _7 |4 W1 K$ Y: L

①简单常用的填色图:

, q# z& _: Z+ s3 {1 e; t' H/ L
import proplot as plot/ E% @3 S, e. r6 p8 ~# d# ? import numpy as np 4 D" ]$ s4 }7 o9 `+ }7 [4 M: w% ~ # 创建虚拟数据8 X$ n1 }: S& |7 R: B offset = -40 g; d# ~/ Y& R6 Q3 ]2 ] lon = plot.arange(offset, 360 + offset - 1, 60)6 `3 K, X7 v& ~ lat = plot.arange(-60, 60 + 1, 30) }# D) h+ ~- e5 m( u state = np.random.RandomState(51423): n; K x; _* j$ q8 w data = state.rand(len(lat), len(lon)) 5 `7 B: K% J( G% t5 i ' G* J; h. a2 y$ ~' N: ~ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi ) |! C0 e6 U: N proj = plot.Proj(cyl)& T+ k8 | Y! C" u4 Y fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)3 N8 V( h) O4 J0 n axs.format( ) C+ |2 B0 o7 A- m- o9 N1 X abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, ; N$ _9 A7 x* [0 S0 i8 W labels=True, lonlines=30, latlines=20, 5 w& H+ m! j% P" { coast=True,gridminor=True,coastlinewidth=1," A6 `+ e8 b# v9 U3 } suptitle=Contourf,suptitlesize=20,+ i8 h) S5 U( m& V3 `) F rowlabels=[Cartopy example], 8 r3 P4 }& G" X$ d4 K# B9 D. R collabels=[Contourf, Pcolormesh])* v- P4 W0 L- B" B, Y5 @: L/ | cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度5 K9 o9 X1 q4 N* v& ^ 9 T* W' K# g. y& t2 r m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)1 X' {5 Y" H, l# } axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 2 Y' Q2 W% {) O& X/ E' v) c5 d5 ~. Y! h& }3 n) a' ~- D% O fig.colorbar(m, loc=b, label=State, - J$ V {$ ?1 s; o* `" F labelsize=20,ticklabelsize=18, extendsize=1.7em) ' m4 b, s( A+ |1 e fig.save(rC:\Users\59799\Desktop\image.png,( Q# S# X2 ?! d8 \& O dpi=600) 6 f2 I" Z' U# ?) l& E( z plot.close() |9 {, f) i3 T3 |7 T; k3 N$ i6 ~
' f2 N8 ^' V- f0 j
& T8 w0 R/ w; d: F7 O

②子图特殊布局:

" S i! U& F8 H
import proplot as plot 5 W+ i3 E8 q0 G* Y2 c1 n& w import numpy as np 5 Y0 y. C9 f5 x% n+ W! M/ ?, \8 s4 t/ M$ T& t, s # 创建虚拟数据9 p' D* B0 R) x D+ R- E5 w offset = -405 K1 V4 [( u3 R7 v lon = plot.arange(offset, 360 + offset - 1, 60)# L, _+ W+ s5 r. Z( x lat = plot.arange(-60, 60 + 1, 30)5 b+ y- i" t( u# C3 o state = np.random.RandomState(51423) & O! M# V# p1 L7 ~ data = state.rand(len(lat), len(lon)) # B( E2 l5 i2 ^( j9 Q7 z. L. m$ _7 v* [0 k 6 S/ W: R- v* G2 [8 {* s subplot_array = [[0,1,1,0], 0 f- e" D: ]8 b7 X+ R# d [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3... * K; W, q9 m- J, d8 H7 ^' w- L" C$ M! a* _+ N, \& L8 ^ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi! A% E3 ?) x9 @! U& q proj = plot.Proj(cyl)7 m% F4 p2 X/ i( q fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) % d3 L8 W- `+ S1 `" m axs.format( 2 y; \4 o- i& n; o" }/ F abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, X9 m' D3 M+ N# ~ labels=True, lonlines=30, latlines=20, ( k, X8 K' U. O3 [ coast=True,gridminor=True,coastlinewidth=1)- f/ Q+ O7 j) ?. k cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 0 D) ~2 o* H6 h) O9 I7 J/ z + Q5 `3 n" |+ u3 t4 ? m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 9 w! b+ R1 n2 A8 Z) j( ~ axs[0].format(title = subplot 1, titlesize=20) 6 |/ l9 I% O f1 |9 z7 Y4 t0 g; A: q: a: N0 d axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) / `9 C; V$ Y8 O4 L axs[1].format(title = subplot 2, titlesize=20)9 m1 Y& L& `( O) ] & [9 G7 n/ M" \+ d% W! `0 v; e$ ? axs[2].contour(lon, lat, data, extend=both)# @2 \& a; ~$ [* \0 o axs[2].format(title = subplot 2, titlesize=20) ) c; H/ a5 K4 ^& x, _3 W/ G/ d! C4 U) L# K$ x fig.colorbar(m, loc=b, label=State, & L3 `8 f9 B3 [ J D+ s2 X! e; {6 b labelsize=20,ticklabelsize=18, extendsize=1.7em) " u0 s1 f# A& e fig.save(rC:\Users\59799\Desktop\image.png,: G7 E5 |: {8 V5 s4 E dpi=600) " R5 N y9 K4 `( L. a& V# ] plot.close()
) O9 z# j" u$ i5 x1 u
6 S0 D7 Z$ j0 V! M

使用技巧:

2 }0 Y( S3 [( U: V& T

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

( L& i5 o% k. @4 f4 {* h3 {" q

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

1 U+ {% }1 A+ `
axs.format(...)#设置全部子图 8 H8 q( ?4 x4 C4 o( r4 g9 f axs[0:2].format(...)#设置第1张和第2张子图5 g0 [& Q" J0 F4 W axs[0].format(...)#设置第1张子图
- \- q+ O! M1 B* j8 ]% N

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

8 X& A: k$ [* d! H8 z0 Z9 z2 p

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

+ O; O9 |* Q3 Q2 d7 v0 r9 N h * M% H: Y h2 J6 y9 } $ |- F! d3 y5 s0 A r; B) T+ g+ w7 Z9 ?( ^ & L' i; b" _) d8 ?% i! v
回复

举报 使用道具

相关帖子

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