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

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

[复制链接]
8 m, U0 D0 I( ?; T) y( E

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

- c& p" K: d& a1 k- @; _+ w& @

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

; R& v1 l x& s# _9 o' R$ a7 r % D) |6 ~) H3 e, P) k3 W) S

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

* I" B( d5 t/ e- L# n' I) b

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

( S6 }$ M A! x2 y/ C 1 g/ Y* f/ ]4 V

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

* o4 d5 f8 ~, ^7 h

①简单常用的填色图:

" \0 X" F. G" x7 b% j
import proplot as plot+ t) G+ h2 D: x4 Z" m" { import numpy as np 9 Z* e) E& S- d 5 |% P8 K$ K% N! U" M7 r. b/ o # 创建虚拟数据1 ]6 G" ]7 k) t0 X1 z offset = -40 & p' \, F5 U Y. J {8 b lon = plot.arange(offset, 360 + offset - 1, 60)3 w1 U; {7 x7 K, [) r lat = plot.arange(-60, 60 + 1, 30)* \. J/ P* G7 i# g state = np.random.RandomState(51423)9 I6 s# \5 k; s. t' g7 | data = state.rand(len(lat), len(lon))6 a5 S) q1 U/ ^ 1 b2 t r$ B/ `: ^ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 3 _4 ~' H1 _2 m6 h, x proj = plot.Proj(cyl) 0 ]2 P1 T8 P) P Y6 S( J fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) 2 _. \5 u4 B; |6 B, s5 \! A0 K. V axs.format( ' `+ K3 k( G1 Q abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, % i6 b' c. h3 h5 k/ F labels=True, lonlines=30, latlines=20,4 Q2 i! f" u: ]/ ` e! c4 c% m5 ? coast=True,gridminor=True,coastlinewidth=1,0 d; S. W1 ?; o$ `% B suptitle=Contourf,suptitlesize=20,1 O, ^1 R. Y6 E. \: u rowlabels=[Cartopy example],) k7 C. [; O( ]) m, a6 P' _0 R collabels=[Contourf, Pcolormesh]) % c% Q/ |8 B c) K( |; J; D cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 + \3 d7 I y$ k/ f3 z& x9 K# m* I7 e" D# Z9 } m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)( k; k# G1 \* r+ O6 M9 D! A axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) o' b) B- z& @9 a$ @ ]9 y$ M, S, H7 n' R+ { fig.colorbar(m, loc=b, label=State, ( l5 a- D. Q/ d6 m0 @ labelsize=20,ticklabelsize=18, extendsize=1.7em) $ G& Y' Q8 T& H! |4 N2 k fig.save(rC:\Users\59799\Desktop\image.png,. U8 T0 N* h- c dpi=600) ) o, z" Q* e. p& |6 l plot.close() 4 C3 ?& e) S2 y, a$ P
, J7 U$ n5 F9 r+ ~6 l! Y& C
) o1 l ^+ m1 [( z! R9 _' ?6 l4 ~

②子图特殊布局:

4 k; U1 c9 B" b8 H. h, K3 Y8 ~1 L4 y
import proplot as plot, I# o6 A8 K% y. Q0 d; [$ ? import numpy as np) S1 Z8 E* n2 U% W- ?' X ( ^) \ H4 W+ C2 s! Y # 创建虚拟数据" \8 _( d! U. a9 {* z( Z; g offset = -40 % q- S+ ?, }8 R6 j0 | lon = plot.arange(offset, 360 + offset - 1, 60) * k/ q6 i/ P+ `* ]) S, U lat = plot.arange(-60, 60 + 1, 30) 1 n( x2 m; Q. r/ q" ?( |. S+ u state = np.random.RandomState(51423) 4 F1 l5 A7 C% _2 u# [& j data = state.rand(len(lat), len(lon)) * E G! L& U5 s' F8 Q% ]: ^ # P1 y c( F8 q * j k/ a) B9 \ subplot_array = [[0,1,1,0], : x+ \- w$ G( K" ~- X5 A, S" u& R [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3.... p6 X/ x: p; U! F+ S8 F6 ` 6 U1 R5 m9 N4 m% r2 K0 d% v# L plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) y2 ~ o: O4 @$ J: A" N8 C b5 x proj = plot.Proj(cyl) % u$ E1 h s& {2 B1 y fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) 1 H; ^+ i$ ?8 e$ l8 t" T axs.format( 6 w' X$ I" x* t& M abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, - L& [3 C7 A9 R labels=True, lonlines=30, latlines=20, ' [% P, q+ D) _ coast=True,gridminor=True,coastlinewidth=1) & B# L0 {: b. p5 `) j" i: u, n cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 4 e# `; r9 n3 \" W4 I4 I, b0 c! e N1 [7 d; P m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 2 P# H6 D$ \. W% h4 Z& T$ e axs[0].format(title = subplot 1, titlesize=20)! q+ S/ s0 K# R+ F a! | 2 G" F! s- m/ Q, E8 l axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)# Q0 k) H- N1 d. s% K& g axs[1].format(title = subplot 2, titlesize=20) ' |' J- L' x; D# j2 x0 O: O. W0 a/ J axs[2].contour(lon, lat, data, extend=both) ( x$ _# V( Y2 | y, i axs[2].format(title = subplot 2, titlesize=20) 0 g' ?1 q3 U! e8 x+ ^3 h V# l t* R8 e1 E8 X w fig.colorbar(m, loc=b, label=State,* Z& k" I H& D V% b6 G labelsize=20,ticklabelsize=18, extendsize=1.7em) / ~* B( W# v6 o+ `* I! h fig.save(rC:\Users\59799\Desktop\image.png, 2 m) w1 K8 ]6 A* y dpi=600) * O: T6 O2 Z1 h+ g. G5 ^" P plot.close()
/ l6 g' ^ t" ~+ R8 R# R+ Y
/ _ b& K: n$ o% A2 V

使用技巧:

) [, u5 o% ?/ O3 W+ w9 D

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

9 `* o4 S7 v4 d' B% f

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

2 I8 b7 J6 b; o
axs.format(...)#设置全部子图 + L" c" C9 ` R( d5 I1 r) |# C- Z, ^ axs[0:2].format(...)#设置第1张和第2张子图 3 H( V& Q9 N7 { axs[0].format(...)#设置第1张子图
+ K3 k* ]' g- U) ~8 N5 C/ y

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

6 t% v; a9 U2 c& W8 A- U

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

6 o1 c% \2 z" V, z) ~ " P3 D# ]" g: L% D8 x# b5 Q 9 O2 Q! X$ t2 b 2 I! h/ V% h6 d" b) j4 P( P4 J9 m4 z4 L2 g
回复

举报 使用道具

相关帖子

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