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

[复制链接]
" ~5 L6 h2 ?% G7 u

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

" d( `" Q$ o. w0 O! g

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

* t& x) C& X- i" T& ~' a / u, m% C! Q' X- Q8 H' z2 S. W

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

; F2 q. I3 | O0 I- Y

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

5 u# u* a" H5 B' g6 q; z; J 9 E+ Z4 T- v# ?1 |* e& Z3 F

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

! V3 K/ @% P! |5 u

①简单常用的填色图:

! e8 s6 E. B+ Y* e- F/ V
import proplot as plot( T- f/ O4 L) P- V3 F import numpy as np7 ^* Q+ P; l2 T$ c 5 H# Y& ]- f, f+ Y Z) C9 X7 s. @ # 创建虚拟数据 . H% I+ d& r$ { offset = -40- @, D3 }0 v/ U1 b9 p) ~# R lon = plot.arange(offset, 360 + offset - 1, 60) 3 a" u! @; x5 `& J; o; a* E# W$ X lat = plot.arange(-60, 60 + 1, 30) 6 D# v% L: F# \* @% U2 | state = np.random.RandomState(51423)0 q3 G; f2 g W% Y3 Z1 y( O6 d data = state.rand(len(lat), len(lon))% j' i. h- m1 O! z * o4 Z1 v e9 e plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi- p! a6 U$ P3 v% P' F+ p$ L9 q% P& _( p proj = plot.Proj(cyl)5 y | U$ c9 C! [& y8 [; |, A$ H fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) c0 n+ K4 K- {" N; v3 v3 K3 \- j axs.format(3 k9 W' n9 B' m& v$ ^ abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,8 E$ q0 Z6 V! y1 z5 D9 q labels=True, lonlines=30, latlines=20, 9 `1 G6 Y' f% z' { coast=True,gridminor=True,coastlinewidth=1, - e f7 z! J! Y4 l2 j$ K" r suptitle=Contourf,suptitlesize=20, ) y, [% s+ M* U0 o, r7 ` rowlabels=[Cartopy example], ' m- s5 t" C4 s {$ u collabels=[Contourf, Pcolormesh]) ' g* r# h- y! G/ b5 P cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度9 v! @) N% f. B' i 6 W; g2 Y9 G# q% v m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)6 x" i/ x9 S1 [" \3 J6 _% y axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both); w9 O- j" G% e+ n! s( D B3 o * W7 g0 d, p9 U5 @5 a- n fig.colorbar(m, loc=b, label=State,8 ]9 f [/ U' S- w) ^ labelsize=20,ticklabelsize=18, extendsize=1.7em) `. e/ ?. f! [, N( s$ N fig.save(rC:\Users\59799\Desktop\image.png,/ H7 h* e9 B- | dpi=600) $ O5 A/ T* V/ M8 I plot.close() - d y) m, b& X2 `$ R5 T
5 c8 u( [% n n# f2 z+ D- B, }
) k2 Z" N( ]+ s% x6 j

②子图特殊布局:

+ r& T, N- z0 F) b+ _
import proplot as plot" T# R3 w) j/ s2 x9 I, E9 G9 Z0 _ import numpy as np0 w" O, W0 m0 o% N/ ? % c0 T7 e5 s; W! z+ M1 x% F9 X # 创建虚拟数据/ t, i& y& y5 { offset = -405 o, L7 J) V5 j9 L7 K5 y2 e lon = plot.arange(offset, 360 + offset - 1, 60) 8 ^8 G; x" N2 s0 O lat = plot.arange(-60, 60 + 1, 30)' A& J# j; M' `" f4 L state = np.random.RandomState(51423) / e& w" f* @, v4 e u' z5 D data = state.rand(len(lat), len(lon)) ( E; s+ r. j/ C 9 l: R3 j4 m( x! Q" u3 T4 W: b; |! ^ % V% q1 X; I7 G- Z subplot_array = [[0,1,1,0],9 N R3 F% h6 j- V0 K [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...( \/ T4 O0 e! @, A / l1 k3 k/ b! f' J9 O& S plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 0 {1 T7 k1 l6 [! G6 L& H5 p$ X* } proj = plot.Proj(cyl) - I S6 v$ O, X$ y. W fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) , i( {/ z/ m) t7 t axs.format( 9 n( p* p. ~' J. R abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 4 A# I2 d8 B" F labels=True, lonlines=30, latlines=20,) v9 e) r8 t+ @: y- f coast=True,gridminor=True,coastlinewidth=1), ~) v+ h( X' r7 C% ]8 o cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 3 c( o4 i: G' a8 ]7 t" h0 q . L" i& {, q! U. C$ `/ o# x2 s m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)4 c' v; _! ~1 m! X% v/ A axs[0].format(title = subplot 1, titlesize=20) ( y% ]0 f5 y9 l8 |, {: y# Q0 Z* d [8 A axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both); |6 ]& o4 A9 K axs[1].format(title = subplot 2, titlesize=20)5 w# t* U- H2 i% a0 u- O q ' a" F# z+ X- f% @ axs[2].contour(lon, lat, data, extend=both) ( J* S9 \( Z$ K6 b! `7 P2 m3 ^: o axs[2].format(title = subplot 2, titlesize=20), h N: A M$ i& z4 }( z. w 5 t( h5 Y) }: e fig.colorbar(m, loc=b, label=State, / j0 e) S% {1 s# L/ B8 { Y1 E! l labelsize=20,ticklabelsize=18, extendsize=1.7em)3 |6 u, g6 K, E r: F fig.save(rC:\Users\59799\Desktop\image.png,* f! B7 L% _4 B dpi=600)# V/ b" I/ F1 q1 B( M plot.close()
. I6 L# k' _7 [1 `
, ~$ p( g8 n8 |1 Z$ ?7 M

使用技巧:

* d: D& u# `: W$ b; N R8 i

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

2 ]& U$ ^* z5 I4 R( K' w/ }

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

+ P' r( |4 {- l% u9 y# i; f
axs.format(...)#设置全部子图 % E4 U: u- H/ D" U. [: Y axs[0:2].format(...)#设置第1张和第2张子图 ! d; x" n3 a6 E5 u( Z* P axs[0].format(...)#设置第1张子图
: I" s3 K# g" E5 c( e7 v }

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

" x; b/ P: j: L* ^" ?, u

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

; t* C$ @# D' } d & u: ?6 [: S+ x % ?; f& [, ~3 I7 a+ K) Z1 o' F1 S) {; m& M8 r 5 y# L( l2 {( ]* R6 i# a( Q
回复

举报 使用道具

相关帖子

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