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

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

[复制链接]
% x. z, |3 X4 k; ?

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

# r Z* P) u8 X5 `- H) J

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

" `/ I) _3 t- {/ p" s/ `& J2 f & G8 R7 n$ y9 C0 h

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

- {' G$ K2 O4 _- {# j" K

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

! a' {$ J5 k$ L. X4 W L* U7 r& \+ q( y6 t" _: N

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

! M8 a7 r' H" @+ k+ r6 X3 [2 |

①简单常用的填色图:

# O2 \1 S6 ^3 ^( k+ n0 ?
import proplot as plot$ \; ?# t Q) ^' o9 }5 V4 e' d; ~ import numpy as np " Z+ A4 s, k# Z* W7 j+ `. y. ?3 m" k, k- x # 创建虚拟数据 ( h- T! W, J) |& R# c offset = -40/ `) @+ v, v D lon = plot.arange(offset, 360 + offset - 1, 60) ; K9 s; Z; I3 w# o0 W. j lat = plot.arange(-60, 60 + 1, 30) ) D$ w/ ]; o! q4 ?, i# t/ g! @ state = np.random.RandomState(51423)' n: H: z1 i0 C1 o; o data = state.rand(len(lat), len(lon)), h8 {* B$ m8 \9 s) p O* T5 g " J5 h8 b' c6 Q- h plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi8 l; i7 s8 v) b4 V' s5 ^0 W proj = plot.Proj(cyl) * v- D; j4 H0 B& i fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) : C5 h, O- E8 P9 j6 Q2 j% u2 ? axs.format(& w- V' H5 n# g4 q5 F2 C abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, " Q" v. [* X) H4 U labels=True, lonlines=30, latlines=20, $ n. N2 g' O4 p- v, w coast=True,gridminor=True,coastlinewidth=1, 7 q7 Q, Z7 ~2 B1 ^8 V' }4 Q6 ] suptitle=Contourf,suptitlesize=20, ' G, m* R6 [; t R. E6 B/ V rowlabels=[Cartopy example], 1 G$ {2 `* q/ `7 Y* R collabels=[Contourf, Pcolormesh]) ( F5 |4 q7 I: @4 I, X cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度2 F" {$ k3 \! P$ L, z/ @, u6 z 8 Z! \' q5 h7 m! C m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)! O/ C8 s! b% `; l+ { axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both); g$ }7 {) E: e6 P3 D9 y 4 }: C/ U; B2 S' F( k fig.colorbar(m, loc=b, label=State,6 L3 n# O' G, u+ ~( I. F labelsize=20,ticklabelsize=18, extendsize=1.7em)+ f' y: E: @; B1 T2 \7 [ fig.save(rC:\Users\59799\Desktop\image.png, , I: s" c! q! Z dpi=600)+ R! \2 T& ?5 W plot.close()- q l* V( w& s: _
9 R0 W5 D5 R" ~/ z# \" |
$ \4 q P. O( R8 M

②子图特殊布局:

; _) E0 c& k1 z5 k
import proplot as plot2 m; }* M1 O( ~9 G import numpy as np N) W9 D: o9 A9 i$ y, s# ` " t9 L9 A D. h* X" K7 f+ y # 创建虚拟数据 & f0 @8 L& g8 b/ U$ ~ offset = -40" V1 b: M8 n; Z* z6 c; I" z lon = plot.arange(offset, 360 + offset - 1, 60) z) G, Y; `' m7 w( I# M# M lat = plot.arange(-60, 60 + 1, 30)' S# `: N @$ z/ } state = np.random.RandomState(51423), A) [9 l V; }; {0 ]5 a data = state.rand(len(lat), len(lon)) 4 B/ H0 X5 E, P8 [' r# L2 p+ j+ b ; d( o9 s) \& U |& g: p% f 2 p6 k& C* f. g' _( L subplot_array = [[0,1,1,0],/ T" F) F/ G- U k E9 | [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...4 u8 g# I5 @6 f' T3 ^. \; Z , X6 P$ Q! ~, I8 O+ e5 t& y! i plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi 7 B2 Y6 R" j; W* e proj = plot.Proj(cyl) / a) s" }) N% [4 S+ ^2 _ fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj), l7 |; v! ^% Z' @/ o) { axs.format( 8 d) Y6 C% P1 o, f abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,& _$ p5 X' ~, c; d' r# W labels=True, lonlines=30, latlines=20, / G" _- |+ X0 O' i coast=True,gridminor=True,coastlinewidth=1)# h( K3 `# N1 ` cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度3 Y6 A2 c$ p! E # {# W2 l2 l* o$ g! h! Z8 D$ U7 g+ ]6 } m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 9 L- `5 B, [8 _4 Y axs[0].format(title = subplot 1, titlesize=20) 8 q, q8 J, U! x3 a3 d; F. O% x4 R l; w5 H/ X' | axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)' W8 C! H& Y7 l J! V axs[1].format(title = subplot 2, titlesize=20) " s9 g: d$ ?' D6 V! `3 v* }/ d2 F" r# `5 z9 p axs[2].contour(lon, lat, data, extend=both)) V$ z! U: e8 t- U0 I/ |9 L8 ] axs[2].format(title = subplot 2, titlesize=20) 3 c3 ^8 f4 M1 \4 u- B/ |# D) k2 x% S( U$ ?* q7 Z4 [% p6 b7 s fig.colorbar(m, loc=b, label=State,& r0 T( ?3 R% V7 m% G/ ^8 S labelsize=20,ticklabelsize=18, extendsize=1.7em) 0 m: b% x: z' @& T9 ]! T% Y fig.save(rC:\Users\59799\Desktop\image.png,/ h! U1 N5 w+ d7 h- k; x; ^ dpi=600)3 O6 q3 U7 a; S, K plot.close()
7 Z2 s6 ^: @, p
4 k/ ?8 N* z6 Z, X- m& f( z

使用技巧:

* u, y* I# W' t

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

4 S: d+ ]% u2 S, u( a0 T

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

" L {# w% l+ w: |; h+ n @9 Z
axs.format(...)#设置全部子图; r" }: [% g6 V: a axs[0:2].format(...)#设置第1张和第2张子图 . }0 v/ Y {% r1 F4 [ axs[0].format(...)#设置第1张子图
z& T7 c$ `0 }4 ?7 O4 B2 w3 Q2 ?

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

1 T5 @8 R5 B6 x6 C; c

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

4 R1 n' f# _, L3 T: m/ H& E; q$ i% c ! A- O/ ~$ S, C" c9 S1 K9 E & s" x9 W: `- d0 D8 C 2 @; Y1 @$ {* c8 \ $ c8 g0 f) V7 u/ ?6 K
回复

举报 使用道具

相关帖子

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