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

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

[复制链接]
* r6 d; s# W6 u; l Z. P& W

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

% i; D6 U) x y+ z* r

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

9 }/ Q3 b; _- s/ c1 S . q* j o% \' x

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

0 p' W; k _1 e4 z* X6 ?3 E

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

: s; w1 ^: n- A7 w Q9 m 0 a/ g9 m0 D; A% o, y& R" `. `

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

1 y( \# l% S" E7 \9 K

①简单常用的填色图:

5 x/ A9 B8 ^: ]
import proplot as plot' W7 E6 p3 K/ y import numpy as np + @5 p% w: t! ~0 g: y " f4 @# A9 H; H1 M' ~" H7 X # 创建虚拟数据$ R& b p! F7 p W offset = -40 * x: U6 |( R6 Z lon = plot.arange(offset, 360 + offset - 1, 60) + e# _% V L0 w" n lat = plot.arange(-60, 60 + 1, 30)7 Z* w. B; Q. P state = np.random.RandomState(51423) 8 |! I! Q7 S& q data = state.rand(len(lat), len(lon)) 2 h1 G, W. Q2 ~% V; T; g% F% ?; O4 t" q' I plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 9 A: h+ J1 r d/ N$ v0 S7 Y proj = plot.Proj(cyl)& C ?4 y2 J! X fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)% x, t1 V& R4 b axs.format(: X- M) _ v# t( y9 D abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,- Q4 K; r7 p. e6 [& J- U! B- d0 e2 s labels=True, lonlines=30, latlines=20, % Y' |: f& _2 U1 m* T5 s$ W coast=True,gridminor=True,coastlinewidth=1, ) Z7 D# B# V# w9 c3 x' _$ t" _% D suptitle=Contourf,suptitlesize=20, + H! {; w% ]3 _/ b1 h rowlabels=[Cartopy example],7 \( X% p8 G8 Z5 ^( v2 g' Y, |$ L collabels=[Contourf, Pcolormesh]) Y3 T& o4 @; H+ Z, o" o, ? cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 ( [5 M8 F9 ]8 H+ m7 R 8 O3 D' A2 i# P$ Z4 \! v& { m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) / n, E4 u4 W, M3 ^3 u axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)1 E+ i8 t' u! W f$ ?% ?8 V8 O8 p fig.colorbar(m, loc=b, label=State,; q3 m/ T' |8 A labelsize=20,ticklabelsize=18, extendsize=1.7em)$ \, c, u5 \ i A fig.save(rC:\Users\59799\Desktop\image.png, # O! I, e5 |' w1 D/ k dpi=600)5 l4 N- h$ S, v2 v plot.close()8 p- j; a. w. T% Y" s) ?
# L+ H) }. f/ {+ _1 y
" w- o; v* y; [6 n

②子图特殊布局:

. y+ C+ A9 Y! D0 M
import proplot as plot 8 A9 X2 @& C: Q8 O+ _# p import numpy as np9 A; L4 [" d# D4 `8 A& o: L 6 o. s \! V j" W: Z # 创建虚拟数据 V6 o2 c2 s2 |. q+ X offset = -40 ; A4 i9 T+ Z. D! V lon = plot.arange(offset, 360 + offset - 1, 60)* n9 a- J8 K6 v) d- q lat = plot.arange(-60, 60 + 1, 30) % Z. o2 L: ?/ b2 F4 r5 g- S" n state = np.random.RandomState(51423) % W6 j$ X E3 D) S data = state.rand(len(lat), len(lon)) ! i0 L# m/ P% ?) @( _ F6 }& G! J& Y. b ( H1 B% a5 W# q3 `! L subplot_array = [[0,1,1,0], , P- h$ t* q" R+ {- c G6 \ [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3... * O9 B% N/ u: I5 N# {+ r; D% m 0 J4 \/ X, P- J plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi: U3 `8 O. s8 W! V; ?% }" c proj = plot.Proj(cyl)- l" p8 W2 K; C: F: w fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)- ~. i: ] z4 ~3 J. Q9 J; j# k' w5 Z axs.format(, k' M2 U% c* ^# f) Z' M( s& F abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,5 E3 |' @# |! x" `. E* a labels=True, lonlines=30, latlines=20,6 C7 |/ [% j* A# u coast=True,gridminor=True,coastlinewidth=1)7 @0 ?6 I0 T# ^+ L cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 - W0 ]$ O7 ]! Z. p/ \6 E % B& U$ ~( f' y5 k+ I( z m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) / w# b+ o+ _; Q; G1 V0 o axs[0].format(title = subplot 1, titlesize=20)5 N! K' _8 V @6 r$ C D# n: ~ ! l% @% K& h6 a axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 3 ^8 ?0 m, L) e; I( U' A9 E) Q4 F axs[1].format(title = subplot 2, titlesize=20) - e" E! I7 z( w4 g , R; j2 q( i `: Q% d axs[2].contour(lon, lat, data, extend=both)$ ^: V" v; J: B/ c3 ^" J0 X axs[2].format(title = subplot 2, titlesize=20)5 c& j! o- s- G Z 8 o3 l0 \/ Q7 r* S& S P fig.colorbar(m, loc=b, label=State, / j @: v% }7 b4 A9 [ labelsize=20,ticklabelsize=18, extendsize=1.7em) 6 ]3 _4 r8 }5 b9 n- T fig.save(rC:\Users\59799\Desktop\image.png,0 d2 y: a0 k/ d% N+ H5 [, v$ w dpi=600)/ p, ~) W3 J0 t7 Z! ^ plot.close()
9 b' ~# j0 J7 h! L
, t5 T" |' F5 d+ I! e3 C

使用技巧:

& L) d# w, N* s

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

* h0 z; b) i% m

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

* h4 L9 q; n7 v2 H% F/ V
axs.format(...)#设置全部子图 ! y r. t, U* |' U axs[0:2].format(...)#设置第1张和第2张子图5 ^ q& e! ?# x+ @ S1 o axs[0].format(...)#设置第1张子图
, O, Y* i) E. Q

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

) c. h" X7 e2 B4 \; f8 a5 G

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

8 x* G9 O/ W6 R3 Z A! E# ] 9 c: q5 y) | D4 b 8 f' z2 A4 d" e- s7 v6 G6 I |% Q3 }/ G ( Z8 W5 h3 f7 @2 q2 ^# t
回复

举报 使用道具

相关帖子

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