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

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

[复制链接]
5 B! ~( o, Z- \! o

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

7 n s. d1 L( I

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

7 H4 y- c7 s( Q! H6 k0 Q2 `* H/ b( f 9 p o. O* l6 }" Y

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

- r0 [$ M7 S- h( ~0 `* i% J

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

4 K4 S6 c' k$ B+ s: C% s ; Y3 T, f) ~' V0 w* h

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

4 p. z2 g5 k8 R ]: b

①简单常用的填色图:

4 |9 \! A" r% `' c+ s7 N& e! A
import proplot as plot* I/ S' ^$ b k7 s( g import numpy as np+ I( |8 f5 n# T# |% |; n9 s N # G9 q3 L! m* t # 创建虚拟数据0 |/ Y* {1 s' ?: T offset = -40/ b$ H$ X: k9 B, ~! e8 L+ B) | lon = plot.arange(offset, 360 + offset - 1, 60) 2 C9 b7 a& x+ Z+ ^3 R8 ^ lat = plot.arange(-60, 60 + 1, 30) 0 X& \8 q; R( S+ w7 g# U- b2 | state = np.random.RandomState(51423)- S5 g7 i3 X$ [9 b( g5 j# i data = state.rand(len(lat), len(lon)) 6 Q$ \5 @2 ~) E + I ^3 t- u7 W& ? plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 4 b+ C% B) m/ c1 F" Q) x proj = plot.Proj(cyl)$ p, ]1 Y; y0 Z9 ? fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj): q p; `9 B7 D" _9 W) C" m axs.format( : R* N" W: A/ n1 |- f: d1 q$ [/ M/ i abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, v, L- b" J0 n4 w, @) K labels=True, lonlines=30, latlines=20, 7 B5 D1 z: x: t coast=True,gridminor=True,coastlinewidth=1,+ X5 z9 B8 m/ m- z: w* {8 p4 p; ?) t suptitle=Contourf,suptitlesize=20,* b4 F J# W0 ]! V6 ~( V6 C rowlabels=[Cartopy example], ' e0 X. }5 J/ D+ p collabels=[Contourf, Pcolormesh])9 [2 B) G+ V# ~/ Y8 r; N& P* ` cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度/ l7 r' |9 [. _9 D0 ~* g4 D' \ 8 k! f1 G* W9 v" `4 H2 ~ m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)9 V8 {7 f2 m; ~" W# [3 v3 u* i axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)( h* y) n- W8 y. o9 f* [' u 3 a2 T+ I# \2 t) b) @ J fig.colorbar(m, loc=b, label=State, % m$ X4 Y3 U# o; @% V9 c labelsize=20,ticklabelsize=18, extendsize=1.7em). Q( c* n. |& ]& G7 F& `: v1 p fig.save(rC:\Users\59799\Desktop\image.png,2 F- @0 r6 n# t: H8 a" ~ dpi=600)/ ~( t( Y8 X0 n plot.close()0 `8 a) y* ^! z2 E% _2 ]/ R
w' y. p% x4 z) H1 r
t5 h! i& |/ T) D

②子图特殊布局:

$ g2 ^3 U! Z- A& w
import proplot as plot - }/ l/ P6 b \2 ?7 C; h# ~- Q3 K- u3 }* p import numpy as np : X) Q' [8 h( B9 y' E# p M. K) O7 ]/ u6 j # 创建虚拟数据: y7 j& i3 M$ f8 g l' D( W1 ^ offset = -404 r( q' d: P8 l lon = plot.arange(offset, 360 + offset - 1, 60) ' T4 t* E) Z# V! G& D* E: o lat = plot.arange(-60, 60 + 1, 30) ) T. n$ Q: K5 y; z, L6 F3 K state = np.random.RandomState(51423)$ w I5 d+ X$ q7 U. r( a data = state.rand(len(lat), len(lon)) ( S% W3 S8 z% F4 b; B* l1 o. R+ v3 U+ L! s3 q $ Q4 B7 U; `" }0 s( b subplot_array = [[0,1,1,0],9 A5 |& ~2 ?( s' c) u [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3... 4 Z7 l: _0 b$ p" n8 C/ w2 u+ l C+ @) { y- q. p plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 0 H) w9 E" z0 Q' @. ^ proj = plot.Proj(cyl); W' n: D' ~3 X7 F# I$ H% y fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) e' D. b$ j3 ], ?9 m' V: _6 } axs.format( s% ^$ ?9 i/ x# f0 j) q abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,- H) Z9 |2 h7 T( c labels=True, lonlines=30, latlines=20, - }. I/ c4 T: m/ j1 g3 {1 ~* M' d, U coast=True,gridminor=True,coastlinewidth=1)! @! ]. J U% V; _( g+ u cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度) A) i X# x$ z3 g; E; z # l0 L! t* T& z9 j m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) + K) c# g: D, o1 {8 x/ g axs[0].format(title = subplot 1, titlesize=20)7 o1 j- I6 A5 v5 r8 R s' O' X8 @7 M - ?2 r, `% Q" ]' o: a( ]/ y axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)( {$ o5 Z8 G: O) \ axs[1].format(title = subplot 2, titlesize=20) 4 ^; \3 s) O1 K8 q1 _3 g2 j9 I. O2 l( X" V. f- N6 y axs[2].contour(lon, lat, data, extend=both): |1 Q. C, k2 G* Z) D& M- A% ? axs[2].format(title = subplot 2, titlesize=20)9 F1 h1 r+ C: b8 ]" |# @, { 6 U4 i% } G: H2 l fig.colorbar(m, loc=b, label=State, 6 |. Y; d( f4 W2 @' B labelsize=20,ticklabelsize=18, extendsize=1.7em) ~ o/ r$ o0 }5 E- h9 _( z fig.save(rC:\Users\59799\Desktop\image.png,. @4 H h3 d2 `8 x' V. O7 X dpi=600); @9 n" Q+ q, h& L7 d% k5 S" t/ T plot.close()
* P0 l6 f/ g0 y6 A' q) {
: b7 [3 B# d. g+ @$ o

使用技巧:

7 {) ?1 B/ [9 \$ A) |, F% K

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

/ D6 w6 R: N$ {( j' I0 k% g

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

! M) z, N6 S: H* W$ Q7 ^; ?8 V: f
axs.format(...)#设置全部子图 # n9 r/ C* Z* V1 ?+ q) _3 @ axs[0:2].format(...)#设置第1张和第2张子图 $ G# v+ h$ m4 P9 Z% M4 I& l8 Y axs[0].format(...)#设置第1张子图
) f0 S0 Z- h7 @# G' r; c0 l, P* i/ U

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

( I% E) J2 W* r! t6 p

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

" D/ p7 l6 R1 q/ I; C4 }0 H0 e$ ~% Y! M1 y: k/ [ # ^- ]: Y0 H9 e : |- t! V2 i) S& C# ~! R: H- G/ J 7 L) O( P* ? r; U: C: h
回复

举报 使用道具

相关帖子

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