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

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

[复制链接]
& O. v: U0 X( |- j

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

$ M1 f- s* o7 C c& s; S9 ^

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

) d9 \" v7 B; ^6 k# B- F- p- m - D, y" `; R% p g/ P6 w! J/ a

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

! [" w, k7 y/ v G! o4 l2 S

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

* u$ M: N" B* {! m+ u ( Y% Y8 b; ]! U- `& |

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

9 n! c) i% \8 u( D1 l' @' g

①简单常用的填色图:

1 y, S4 m' N9 j$ {; t
import proplot as plot8 B- @- T n# ~; E$ [9 j, n import numpy as np % ~. F" M/ K6 Z' V5 P# U; ~' b% O7 z. B 4 q* B+ P. U; Q4 }* C0 o # 创建虚拟数据 - C9 B$ u. u% {; E4 S offset = -40+ [: N' y6 }2 w, R( c lon = plot.arange(offset, 360 + offset - 1, 60) & d9 B* e3 O2 V' p lat = plot.arange(-60, 60 + 1, 30); X/ J& m0 T1 }" j# @2 g' y state = np.random.RandomState(51423)2 W9 z: Y1 V! ? data = state.rand(len(lat), len(lon))* t- D5 a/ @0 w$ a/ W4 \ ) C( P7 q* u2 L; }5 D' N* ^ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) `& z F) ?+ V J6 Z4 b. M4 J proj = plot.Proj(cyl)0 C5 g6 [$ q: h, y" u fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)3 l, z$ f) ?$ @5 M. J' P: Z5 r9 ] axs.format( ; G' n5 }, H( N) g" Q. ] abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,# ~- R [ Z+ ?, c( m e6 U7 V* [ labels=True, lonlines=30, latlines=20,1 m: C0 A5 I0 g7 V coast=True,gridminor=True,coastlinewidth=1,7 S( K, D4 o- B! R: t suptitle=Contourf,suptitlesize=20, 2 P7 _& n) ?0 _( X7 @( ? rowlabels=[Cartopy example], , |) g3 @( S% ? d9 J" k collabels=[Contourf, Pcolormesh]) ! v6 ^$ {% @# w' Q: q1 [- \ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 8 E8 ~0 P3 k5 l$ `/ i6 {0 |: {0 d- t* c" b* m" Y m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 6 j5 w1 \5 C0 t$ L* i) I axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) ( W4 s8 Z/ V P' Y+ d , G# X5 t8 x$ l8 X fig.colorbar(m, loc=b, label=State, $ I% k8 x9 r4 x0 }% ` labelsize=20,ticklabelsize=18, extendsize=1.7em)) @; t7 d, W3 X5 W fig.save(rC:\Users\59799\Desktop\image.png, r! [" N: U4 ~) V dpi=600)( |6 T& ^9 @+ P. K3 T9 h/ M plot.close() ; A1 k3 b/ @4 x3 l/ k- a# R
. y5 S! W) @$ m1 w: g" M" X' ~4 Z
& Q# H, ^( Z$ g. V' z

②子图特殊布局:

- n2 U$ A- d- S
import proplot as plot 4 x/ Y. T4 V% w* l* ?+ ` import numpy as np 9 h1 p2 \+ p3 H& {8 [5 Z9 F ) b8 g/ p' P% Y2 u. z # 创建虚拟数据 $ R# g% a+ ] D$ E6 f+ D% T" N offset = -40 6 w, c3 |$ D, `- u% C lon = plot.arange(offset, 360 + offset - 1, 60)* x0 f0 }% m' ]: l lat = plot.arange(-60, 60 + 1, 30) 1 Y, E. W! P. Q) ^ state = np.random.RandomState(51423) " X, X. h8 l5 _- y data = state.rand(len(lat), len(lon))7 B/ u$ y% M1 A" t' |6 W, r* q ! T8 T# X1 k9 S5 {- d3 v/ D + P. j4 e! P& w/ N subplot_array = [[0,1,1,0], 5 [" Z3 p1 _$ O" V [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3... ( B) C s8 i7 J7 i6 U 0 ^- h* j1 g* o( ~0 b" ^7 O+ b plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) D7 p+ ^: o! J0 O proj = plot.Proj(cyl)9 Q$ |- P0 R8 ?- b& e1 _( ^ fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)) i$ q6 L3 K8 O- O$ I. { axs.format( . w+ j# a3 G* z+ l abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, * C7 N9 G/ q$ m; P$ D! l% a labels=True, lonlines=30, latlines=20,) ~2 g0 n/ D$ C4 ~! Y; s# K coast=True,gridminor=True,coastlinewidth=1)1 _9 P) o3 }2 s- c cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 ( B. B( M; u8 R: n* k# Y- e5 T8 D8 i4 z5 f- V* [8 I3 X( r m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)! X2 |5 n, Z; s2 |: P% |, O axs[0].format(title = subplot 1, titlesize=20), l5 Z. U$ n3 \. t: l4 Q $ k: N j' f( O/ ?* R axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)7 o+ o/ T& M% q' r+ R axs[1].format(title = subplot 2, titlesize=20)( A. Y7 {3 o7 p7 m" W; W- u ; Z6 e4 L0 P' M) R$ S0 F9 N) J axs[2].contour(lon, lat, data, extend=both)# v0 A, [( h; _ axs[2].format(title = subplot 2, titlesize=20)3 h* t# g4 k# F/ V( Y2 A; L4 F - O ^: b) f. d! K fig.colorbar(m, loc=b, label=State,* S# M# \" |9 q7 G labelsize=20,ticklabelsize=18, extendsize=1.7em) ; \# r* h% Q Y' F: E fig.save(rC:\Users\59799\Desktop\image.png,* }) N( {! i# L dpi=600) * G u+ z* Q8 A' } plot.close()
0 g' p/ n2 T! P* G
+ E$ v2 I3 e* ^

使用技巧:

9 i( m# v E7 A" _8 X. l0 A6 W; J

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

6 f! f. L$ ^$ m7 [( U% B0 `

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

* i1 o3 F2 a8 C+ H u
axs.format(...)#设置全部子图* R# i+ r* P6 h$ C6 S axs[0:2].format(...)#设置第1张和第2张子图2 E: Q" B9 ]$ @ axs[0].format(...)#设置第1张子图
d( f+ q! Q3 {& u) F5 o

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

" C9 L+ q x9 V! q- G% ^

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

6 A( y+ @ {! I" g6 ?5 w! F- P4 N5 ]' P . x: q5 G9 M6 v) m2 @( I1 _3 v) J 2 ^) M% R. Q2 j. T6 |) _0 v
回复

举报 使用道具

相关帖子

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