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

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

[复制链接]
/ I/ F& o2 _9 K6 Z3 d$ g$ l4 q7 N9 b

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

, }/ G' T9 m& d( \; M) o

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

$ r4 A7 F. C; w! F% ~+ v0 X ( F6 p% b6 [9 b0 Y8 i

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

6 K( Z4 ?) \: k* l6 u

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

8 t* N! Y1 g7 x, ^' ?9 r/ a/ p , ?4 f9 |! K7 w/ v; i1 ^

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

) i8 g2 \0 Y' m, P$ o

①简单常用的填色图:

$ v" F0 O8 t4 E8 z" f; |* k
import proplot as plot , i+ Y& K8 m- o, G import numpy as np : D% `' T, t9 f- G0 T+ v! w4 d+ M4 I' {% [5 K/ }7 N/ L9 W P # 创建虚拟数据: ^1 O1 {; M0 Y/ }- M1 O- I. b offset = -402 Y- q9 {' d, j, m" p lon = plot.arange(offset, 360 + offset - 1, 60) . _- R' W0 e- g, V9 n lat = plot.arange(-60, 60 + 1, 30) 8 U4 O; ~- g6 k+ W7 c% d state = np.random.RandomState(51423) ; r, k4 b2 f( I4 Q# ]9 Y6 C" {( u data = state.rand(len(lat), len(lon)) # Z' q2 i/ a% c6 e7 S5 ], b2 I plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi/ x( R2 R5 W( ]( ^/ C& ~2 A$ n, }2 S proj = plot.Proj(cyl) 1 R% O: P3 V( k& n* `1 G$ b fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) # Y3 O' H: O3 A axs.format( A) L- y% N. n$ |8 q% U, Y abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,% q% Y- S; a6 k labels=True, lonlines=30, latlines=20, 2 ~7 d5 | S* C9 N# @ coast=True,gridminor=True,coastlinewidth=1,+ R4 N, z* k- l, P3 P3 d, Z- A suptitle=Contourf,suptitlesize=20, - R5 w) T+ n. w2 Y1 @0 W* | rowlabels=[Cartopy example],, {- \8 ^, |4 A _2 x9 z, b collabels=[Contourf, Pcolormesh]) ! T* X: L, r0 P+ d J cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度! e5 B5 N- {; k1 Y 6 N0 \, ]5 X8 x) T, i$ m4 e m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) ! ~ C- z/ C0 D3 u" L4 V2 @: m axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) + q4 Y. R; @, M3 Y% z8 q: A6 C d: m0 x$ z3 D3 q4 @. T) M fig.colorbar(m, loc=b, label=State,' B4 d" u! v* {: q# R) ~8 z labelsize=20,ticklabelsize=18, extendsize=1.7em) . C6 P" G8 K: {& Z3 I fig.save(rC:\Users\59799\Desktop\image.png, " k* L1 c" W) j) Y" { dpi=600) 3 H/ A8 h( p& }* R9 S4 O plot.close() $ Z9 T5 l0 [; M' }6 S* b+ ]
# s+ o2 ] z$ D [+ |* j! R
& T. g( g, F* b' K

②子图特殊布局:

, s5 G: ~) [$ N- o& v
import proplot as plot7 L" }# C) ^, ?* ~% o* N. n import numpy as np " H, ~ j5 {) B9 `$ r) V) G; V 5 U$ _! g' }4 O( u+ h" { # 创建虚拟数据1 J" b4 z" m9 M offset = -400 M) p$ m* d& X' Z. a" t lon = plot.arange(offset, 360 + offset - 1, 60)" @! u7 W h% b" t' A lat = plot.arange(-60, 60 + 1, 30) % V0 K+ a3 T/ E5 W+ S state = np.random.RandomState(51423) - {; v1 a) P6 `4 N data = state.rand(len(lat), len(lon)) * ^$ M8 k/ q4 {6 Y2 v4 t p! k% D1 ?2 h. E4 {4 Q# C ; T$ [ D" W' C Z5 v subplot_array = [[0,1,1,0],3 r2 i' q5 C9 J8 F) N [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...; ]6 ~% Y: j6 g( M 4 i+ e2 O& j0 W& H4 a3 {* e plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi5 g1 Q8 |% ]! Y. ? proj = plot.Proj(cyl) / e2 C5 t" |* K/ ^( y( d) | fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) 2 {- u/ w5 Y' A" a! ? axs.format( f: J! W J% ^( P9 H- V7 y: Y abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, + |! b3 w/ A) |( z% L' f3 V labels=True, lonlines=30, latlines=20, x1 x, n8 P" c# n6 } coast=True,gridminor=True,coastlinewidth=1)- K$ g' @" V& J; ~/ H+ f! _ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 : W1 U0 q2 @/ u7 I ( u& J: o9 [. P; |8 O- c5 @ m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) , Y. D5 Q% T* U axs[0].format(title = subplot 1, titlesize=20) + N. _4 P( [4 C & k/ f8 j- z5 x7 E) Z+ z axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 2 t/ i% C; y0 i$ L8 E, {/ T2 V. e axs[1].format(title = subplot 2, titlesize=20) , J J" J1 W' K$ G. c & d1 ~) H; {1 d: e0 y" d M axs[2].contour(lon, lat, data, extend=both) ) B. w g9 i, |: k. i6 ` axs[2].format(title = subplot 2, titlesize=20)3 O7 ]" j6 ]( Z- `7 G 5 \4 B" B; M+ l9 v fig.colorbar(m, loc=b, label=State, + a3 Z- K x0 x O" y# N- H7 j labelsize=20,ticklabelsize=18, extendsize=1.7em) " j) s1 a7 `" i" d1 w/ N) z4 ^9 a fig.save(rC:\Users\59799\Desktop\image.png, 0 ^, `/ a: E- J dpi=600): X! f/ J- n; @. O! F plot.close()
7 P ~$ u- q/ y! |5 d. w
) R6 ^5 g8 x9 q

使用技巧:

7 S; G! ~3 l+ |! [2 K6 E2 B

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

( b6 _) ^' ?" W! `

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

6 O7 |" [3 M$ E- `
axs.format(...)#设置全部子图0 J* q5 l# t6 Z" m9 q axs[0:2].format(...)#设置第1张和第2张子图 4 c- D2 W6 F' }% U0 q1 K axs[0].format(...)#设置第1张子图
4 e/ ? f+ T9 A: W( F# O

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

) f3 Y7 o* M$ I8 }

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

5 M4 R( V" x$ W/ C' r1 d5 q, d' r6 d4 e/ N8 z 6 ]% j7 |4 d! U8 h5 A# H 8 k. D/ H# e3 o' G4 B) G $ j- `" o9 u2 |: S. Z. O
回复

举报 使用道具

相关帖子

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