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

[复制链接]
, x) C% k* O) I5 q) c, a

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

( H+ G. S0 |' }. I Z( Z8 C: k

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

, R: ~* r6 D H , L* @4 r; X) {% U/ j' _

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

( p- R( P$ m1 l( J

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

8 V: \' `% z8 P7 h " M& ]/ S& [* b) T, N N3 k+ F# k; B

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

& o. O0 \2 T7 H/ S$ \0 A g5 y

①简单常用的填色图:

7 c/ w9 U) E/ ^! m- q5 r8 ^2 y
import proplot as plot - L4 z1 U! i4 X% w( C import numpy as np9 |$ @) L+ r+ ^7 {: F 7 l, s, G8 N" c+ Y$ T9 y& t9 C: G' ] # 创建虚拟数据 9 }- S6 ]& f' A* c offset = -40 - h) c0 q8 r3 M" P, O$ v8 u. F lon = plot.arange(offset, 360 + offset - 1, 60) + c2 t% ?( B4 s# p lat = plot.arange(-60, 60 + 1, 30) 0 Q g- k% `" k/ o- _, a state = np.random.RandomState(51423)$ e" B# A" \7 D" f9 t5 W# r R data = state.rand(len(lat), len(lon)) 3 [! D( A4 l5 p7 `8 B/ F" Y # C; k' d* Q- B5 j( W plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi # X. V* y) f# j proj = plot.Proj(cyl)3 e3 F& W$ m+ A4 o( D3 F fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) G& e6 ?9 p) r3 J) ?7 H axs.format(+ Z/ D6 y; q1 n4 q" f, M T abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, : ?& g" s" @( H1 V labels=True, lonlines=30, latlines=20,) P+ p( g6 f9 Q3 z( L/ x: x Z coast=True,gridminor=True,coastlinewidth=1," F, F; t8 N- s- j7 j3 a' u& K" v suptitle=Contourf,suptitlesize=20, * _. m t4 @; P: R rowlabels=[Cartopy example], " Q$ j. a0 k) m collabels=[Contourf, Pcolormesh])4 t5 C9 p! W9 s: b cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度0 P2 s) r4 L( ^2 w' ~ ! o! ~! I& v" [0 L% [0 }; Q. J m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)' J! R {1 {: p$ S axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)& e5 ?" s; W$ E$ ?6 @3 T - L; v! F* a* m: }1 Q fig.colorbar(m, loc=b, label=State, " z. Q/ E1 r1 r) M# l labelsize=20,ticklabelsize=18, extendsize=1.7em)- P9 }2 o. n2 _, C& e7 V fig.save(rC:\Users\59799\Desktop\image.png,: @& ]' `: V( A/ u dpi=600) & J( T) q1 j! r/ t, x! X0 p plot.close() + G* u" n. F/ F( J7 Q/ q
0 O$ r* w! w; T
& S! j% ]+ g' b3 T" Y4 d

②子图特殊布局:

6 p, S l+ k0 R2 A+ I y
import proplot as plot & H. M- n! G# s0 \8 S6 \; p import numpy as np 5 S9 h- g0 ]- y5 u& J+ F" j$ x& J5 S+ @; f) d2 \ # 创建虚拟数据8 N" ^! {6 _# g+ V( W o% ~1 ?6 y$ c8 ^ offset = -40 # m7 g0 C( R1 W4 |& L/ S lon = plot.arange(offset, 360 + offset - 1, 60)6 I6 F3 R* I7 u. v( y. q- O lat = plot.arange(-60, 60 + 1, 30) + i& I. ~# d3 r# u" C; H) w; V state = np.random.RandomState(51423) 4 M8 K; b! g5 B# a6 t: s( ^ data = state.rand(len(lat), len(lon)) ; R( Y) \, ?) |' p6 H2 @" q1 T& }+ Q9 i ) J! s ^* T8 o8 j * R9 u* X) i( z2 }8 K subplot_array = [[0,1,1,0], 9 n( X( W u3 C, w0 `( n) I0 m( D+ s [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...& B* ~+ _2 s* `1 e* Y2 S1 X + W2 y" Q( f- J3 ]$ c* S plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi / l% f' a- N2 X proj = plot.Proj(cyl)* d4 _0 I. y# k. V9 a8 A fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) ' v0 g y( t: A. c b9 R axs.format(- G# q u1 |# u4 L" }9 e+ l+ { abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 4 m7 @* D( g$ Z% g$ y; B+ L labels=True, lonlines=30, latlines=20, 0 ]7 _. R! t$ @- I coast=True,gridminor=True,coastlinewidth=1)+ ]: K7 u1 o+ S, B9 Q% X" ^ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 8 q1 H. J$ a4 z6 X3 v0 S - Y' f; y% j2 Y3 Q m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) " Z! n' s; v* P2 R& c axs[0].format(title = subplot 1, titlesize=20) T3 a3 @" s) V$ P) K + V' P9 q3 p2 | axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 3 L5 u ]* E# b5 {& T' Z6 |' P) A" r axs[1].format(title = subplot 2, titlesize=20). B# k% U4 I) s* D, k 3 s' t0 T2 Q; K X axs[2].contour(lon, lat, data, extend=both) 0 N& r; f& H, b3 b. ^ axs[2].format(title = subplot 2, titlesize=20)3 `9 x, U) V/ a. O$ P) t0 d- e, @% b . l5 y9 n3 D9 d! i8 I7 @ fig.colorbar(m, loc=b, label=State,! S7 L# H- W: x: B2 e labelsize=20,ticklabelsize=18, extendsize=1.7em), q' \; X# h( V5 F( y! i/ w fig.save(rC:\Users\59799\Desktop\image.png,& t$ B! p% O/ x5 C' E: l" e dpi=600)& x6 R9 c7 q6 \' p7 u: G# Y/ x/ t$ I/ c plot.close()
% {4 c0 N1 g) d, S
) O& L# L0 B- i7 h1 ~2 w% g

使用技巧:

$ l7 `* a- u4 y- _) o9 t1 n; W

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

: i* l% @. w3 z; \; {+ d

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

8 t& [( I' A# \* I4 U
axs.format(...)#设置全部子图 * l' |2 {$ |% M$ K( j _ axs[0:2].format(...)#设置第1张和第2张子图 4 o5 p: L7 w* a* H2 w% t axs[0].format(...)#设置第1张子图
& T. L4 B6 U) R

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

6 Y9 s, l+ l; R- p6 D' w( ?

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

( R# w1 o+ Z$ D5 z! \! P: S+ v) u6 m& f 9 Z$ @9 R. \7 `! J4 x- [* g& M% j* s ! G2 n3 Y9 l; }2 E* ]9 ~, O6 I" W4 {9 o
回复

举报 使用道具

相关帖子

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