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

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

[复制链接]
+ K$ L: P3 D, T- _# N

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

* p0 t% ~; n) P# B+ _

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

- a- j% D4 X) { : H) }/ n: [3 b* ^. g

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

+ d, { A3 E) D8 p1 H: ~" w- m2 u

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

: [; r& u, u% H% o, F ! J: u+ N6 \' t

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

+ D# U. c" D) N& z

①简单常用的填色图:

$ E6 b5 {1 U5 S3 Z Y) a
import proplot as plot4 J! Q7 C# o6 `" V+ J8 H4 K* r import numpy as np$ |% o5 a% [4 U 4 h/ [1 f$ z( B # 创建虚拟数据- c- d% d) Z. }5 u' P/ a+ B offset = -40) `2 S' [: {3 M& a: p3 B9 C0 I" M! q lon = plot.arange(offset, 360 + offset - 1, 60) 3 n7 Q9 h3 w5 q( m lat = plot.arange(-60, 60 + 1, 30) , [% G# j% s4 O2 w0 c! [7 \; ] state = np.random.RandomState(51423) 3 M# y" q. y, e data = state.rand(len(lat), len(lon)) " B8 q+ r1 w% B% N+ m 6 v2 M/ A4 m1 \) a3 c plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi - W) s7 ]# o! J0 D proj = plot.Proj(cyl) $ k) X# e8 ?4 _2 }1 A9 n fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) , q( t" I, | V axs.format( 5 O a. ^3 U8 ]/ `1 j6 @ abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,, p7 F9 P1 A& Y) N+ c labels=True, lonlines=30, latlines=20,' f9 J$ Q' J* Y) p. Q coast=True,gridminor=True,coastlinewidth=1,0 S+ {; R( q- B# G; r. l suptitle=Contourf,suptitlesize=20,& s# C) t6 _4 j3 }' _- f rowlabels=[Cartopy example],( \2 a$ n5 v8 N' [; f- @ collabels=[Contourf, Pcolormesh]) * i. J! l; H/ m0 D" Q cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度) w2 o/ ]; ]( K/ t 5 ]. N. B1 l6 d2 w m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)1 l' Q' K+ i* D- A, p axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) ( }% f4 v. p2 c2 k" b: O ^7 z$ t3 T1 [" R9 m' D8 a7 _- v fig.colorbar(m, loc=b, label=State,! d7 q" [" Y0 w) x$ {; y labelsize=20,ticklabelsize=18, extendsize=1.7em) . q, |" z! R: Q2 g1 u7 P& z& n+ _ fig.save(rC:\Users\59799\Desktop\image.png,2 O+ R4 A2 m$ r$ U- N7 a# ] dpi=600)8 m; X' S3 V! P plot.close() ' z. D4 j3 u- E4 M2 I2 y7 T" c
$ S; Z, J7 ?7 A, o- ~, {
+ F3 N$ g8 O$ }) N8 D' L7 a+ v0 R( W5 l

②子图特殊布局:

7 @# t1 Q3 @6 p- e) C7 l& w6 O, L
import proplot as plot* D. Q8 s6 T( |' u- M% t) A import numpy as np 5 A9 `- z! |9 W % U( y( s$ s5 p4 u # 创建虚拟数据 ; H+ [ _0 M- M4 t offset = -40 6 ?; i/ Y0 R' u- T3 c- u0 e lon = plot.arange(offset, 360 + offset - 1, 60) , m0 V4 N( _0 e4 D- H6 N& E1 p lat = plot.arange(-60, 60 + 1, 30) 4 {9 w7 R+ [; Y; N8 { state = np.random.RandomState(51423)8 t: p. l2 t! o- Z! U7 D data = state.rand(len(lat), len(lon))( W$ V/ {2 e0 A& Z# c( y. R ' W+ u# c1 F' G* E. N1 s6 x' m: x* }9 V6 e1 ?) m4 C3 \7 M+ Z subplot_array = [[0,1,1,0], . w, q4 `. h& F- J- p) k$ Q8 L [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3..." _! p+ ?1 {+ a 1 c7 C" a5 J. G# z% T) k" w plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 6 }2 K( I& ~ I& X# X8 r( v proj = plot.Proj(cyl) % y2 d! _: H/ j fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) 7 n" b1 |3 o7 Q& ` axs.format($ f3 g- F4 B2 T0 h% J; K" H abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 4 n3 C% X5 M/ r* L. L, u- f labels=True, lonlines=30, latlines=20,/ ~- m; R. e' \2 Y4 x coast=True,gridminor=True,coastlinewidth=1) 9 I; m% ~& F, c6 {, M. ^ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度% X: {+ I! ?4 e7 g- j! x ) F5 |; e) u9 {+ v3 U- h m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) $ w" S: H# \' f axs[0].format(title = subplot 1, titlesize=20)! O3 c1 o" J) D1 ^$ O . g0 r4 t* W! r2 I6 t axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both): j: C# w6 e! }# o/ W axs[1].format(title = subplot 2, titlesize=20)9 Q8 h# ~! l' A; |+ l% e9 k # t) E' i4 a. k+ J# ~5 W: P7 [# } axs[2].contour(lon, lat, data, extend=both) $ X; |# Z' p3 K3 a+ h axs[2].format(title = subplot 2, titlesize=20); f# D7 H, m L( A% K8 C' c ; \+ B5 b* X. I3 Y$ Y fig.colorbar(m, loc=b, label=State,( D1 s h% d3 b labelsize=20,ticklabelsize=18, extendsize=1.7em) 1 H, {& W& ? Z" f fig.save(rC:\Users\59799\Desktop\image.png, 0 W9 P1 Y6 B7 q# p- @/ R dpi=600)" \8 @+ g' N; s8 ]$ ]3 ?, ^9 t plot.close()
. c/ C1 ]" x. M2 X* D n+ x
* x+ k% |. J+ @& X) f

使用技巧:

; x- l& q4 S8 Q1 [

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

) m' ~, q3 O2 T

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

. A) K. g; v2 h7 B
axs.format(...)#设置全部子图+ |& {$ r; X8 Q0 A6 K4 | axs[0:2].format(...)#设置第1张和第2张子图 / F T% c# C( Z+ B! L8 i axs[0].format(...)#设置第1张子图
2 K2 x2 a' k! [2 A+ U; } ?- _5 E- Q

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

+ c' s( n! a/ o1 i$ L/ p2 g

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

4 I# f' k: f' c! h& \2 b$ l6 A# `8 l3 R" C# W/ W6 B5 F 9 y; [ h* z4 n9 Z! p ! `5 \# O" i( Z% u6 P ' \" h+ G+ s. B5 S/ p! b
回复

举报 使用道具

相关帖子

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