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

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

[复制链接]
0 J7 F7 L* P3 x4 c

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

& S5 Y% m3 z# }4 Y- E* O4 {4 e9 Y, |

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

9 T8 D% u1 t0 \, g ; c& h$ {- [7 Z

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

5 w; m, @) P1 g

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

/ \" H/ k. s* P3 Y ; Y$ L& K) O% X* E3 H

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

( h3 j0 ]; V8 y' t- m

①简单常用的填色图:

5 T- D: C7 t- _6 X4 B+ ]% u
import proplot as plot 9 M9 o2 j" G+ n1 y" j import numpy as np; G7 S1 }7 x( R& C# B V0 ^ 9 r8 Y: B! c( N' o4 n: `7 n # 创建虚拟数据 & [( T; P$ z) g2 O3 a offset = -40 8 N8 V2 X' q$ J( b! Z, @1 b lon = plot.arange(offset, 360 + offset - 1, 60)6 Y1 {0 C3 {! x% Y2 k( k lat = plot.arange(-60, 60 + 1, 30): e$ ]6 _' I7 A1 j7 {& h& X state = np.random.RandomState(51423)! ?* M/ ?" q5 S8 z data = state.rand(len(lat), len(lon)). B& k1 p8 ~" z6 Z3 ]1 Q+ h . M: W6 p; I, S plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) S* B- D: B& f8 \ proj = plot.Proj(cyl)5 V, F8 I* P; L8 c7 Q fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) . w; N0 o$ @* S axs.format( 3 k( s0 {& z. `0 `& w abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,$ z* y2 f. o1 C* O1 M labels=True, lonlines=30, latlines=20,! [6 i. l1 n: Z" T- O) ]" ?' F coast=True,gridminor=True,coastlinewidth=1, : m6 e$ e- F# F. S7 k M9 W suptitle=Contourf,suptitlesize=20, % J4 f! C) ]* V" X rowlabels=[Cartopy example],/ N; y( q- V* ~ collabels=[Contourf, Pcolormesh])3 o; @( b9 n- U D% B' N cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 / u2 x8 Q. l( T8 A+ K5 r # T% L- C" }4 q4 n' d2 p8 }7 V m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) ) ?! x6 _+ h4 I0 V7 L axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) 9 y/ x! y0 G& r6 B/ t" a& y- \" f$ e" m* M fig.colorbar(m, loc=b, label=State,2 l+ k6 m Q' y ^ | labelsize=20,ticklabelsize=18, extendsize=1.7em)) ]" F: Q0 L) E. D I3 d fig.save(rC:\Users\59799\Desktop\image.png, 2 B. T9 I2 Z8 N7 r) h b. u dpi=600)% S- ^% ~+ S" V9 x* J: s) ?* p plot.close() $ p9 ^; |& Q& K, |
$ p4 B# c" q, a
- p, w! H. ^& J: A

②子图特殊布局:

( P! M: a& |! S7 a
import proplot as plot7 t+ L; W% \6 T3 r. ^% f" W' B import numpy as np r) d" \ {: A+ V8 H9 t . L" t) `/ K2 h M # 创建虚拟数据% b" e- Q' g; H4 ?* F offset = -40 " U( Q' J) B: h: l lon = plot.arange(offset, 360 + offset - 1, 60) $ q0 W6 g8 s; t, R; ^ lat = plot.arange(-60, 60 + 1, 30)5 }- x: \$ n1 _; z2 q state = np.random.RandomState(51423) 8 a2 ?; ]) T0 w6 F: E5 h data = state.rand(len(lat), len(lon))1 w# y- D+ Z7 ` , t- n3 M' S4 e' Y6 U( f- @ % T* [$ d8 Y# ]6 M p subplot_array = [[0,1,1,0], [5 x$ P3 \( s% @& S! [! ` [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...% | ?$ N: i+ Z0 K 6 Y5 b6 e- x2 u6 ^, d/ \- Z0 T1 } plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi ; \# j; F3 i9 D proj = plot.Proj(cyl) ; k9 z6 G" S( y" e/ w8 u fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)1 Y- F; t: d) H* C6 } h" p2 d axs.format(2 A( J5 X5 x- y8 R, V% b" N$ V abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, " B; q0 {4 ?' y3 J3 H- O% V labels=True, lonlines=30, latlines=20, 2 o, S L" c4 m3 W5 J$ r) L coast=True,gridminor=True,coastlinewidth=1)% x2 s% b2 l7 }* W3 M( c& a) Z! r cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度9 L- ?% [+ a& B8 d2 j: k( x" H0 Q + o( L. F! P! ?' Q4 _ m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) , W4 Z% D+ g# L& A( q4 f axs[0].format(title = subplot 1, titlesize=20)/ I) [" R u9 Y1 j2 u7 [$ j3 X 5 q) g8 J" u* C' v7 l) w Q axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both): K# I) Q6 t7 d3 T9 g4 T/ J axs[1].format(title = subplot 2, titlesize=20)" J4 f- ?3 d" u/ K0 h* ~ P7 J) [- y+ P 3 Q1 x8 P/ P( M8 W axs[2].contour(lon, lat, data, extend=both)* o' H" Z( N5 ?9 e axs[2].format(title = subplot 2, titlesize=20) " G: P2 P! ]# \7 V" t5 Z9 o" v2 Z " O/ c, p A& T1 Z* ?, [7 w9 T; j fig.colorbar(m, loc=b, label=State,9 W v. y; M% a- C6 x, k1 }- Q$ n labelsize=20,ticklabelsize=18, extendsize=1.7em) ) s% z G- y3 b; i9 B fig.save(rC:\Users\59799\Desktop\image.png, 3 C- A4 ^) g8 j( T: B0 P9 o dpi=600)9 H# G9 f# ]( K' D0 h8 {# W plot.close()
3 n0 K R( `5 {5 T& c
: I2 P% a- T5 x9 ~$ g% g9 K& a

使用技巧:

5 L7 j5 T) y) p2 p& f' ]: y: i2 `/ C

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

, ^5 \# m# J' D$ E4 J

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

) k9 z$ E4 I1 t' Q; L1 R. E2 h
axs.format(...)#设置全部子图 8 C, c! A4 K( f& N axs[0:2].format(...)#设置第1张和第2张子图$ m1 E8 F% A' s1 T9 V4 u9 Z axs[0].format(...)#设置第1张子图
6 _7 j7 D* I6 |4 I. S; B

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

8 L" G& p2 A1 L

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

) y( @4 V! G; L( I1 D+ e# ] : N2 O7 c( D3 V& n" ~* ]4 {+ h1 X0 k 4 ?2 O, V, s+ h7 u. [ : |3 L: i7 [5 [. a/ Q / N* L7 F! I4 `7 \ ~' n* w% D
回复

举报 使用道具

相关帖子

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