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

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

[复制链接]
# K( y6 i, q$ T Q

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

9 z6 @3 A1 x6 x0 i' G! _; O

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

7 j5 O, c6 |. Q- u" `8 p7 _: q + L! ?- ] |8 V/ ^& Z+ x1 ~% `7 @6 Q

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

9 w6 y% H' {6 q

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

4 v" _$ I, C+ ? " e+ W% u. R; Y4 k% Z. o

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

0 V% D8 G; X' m. M

①简单常用的填色图:

( K1 b) u4 a- D. k1 }! T
import proplot as plot+ w" [; u4 ~# K& \& Q! a import numpy as np . E" i1 Y' ^" G4 e$ e1 I. v) [9 w& R8 @& E1 r; j. q/ B1 P # 创建虚拟数据. L2 L+ B! A5 {; K& v- W5 P offset = -40 0 k* N* m; x/ ^0 i$ d8 B! T" } lon = plot.arange(offset, 360 + offset - 1, 60)1 d. [2 r' I; g) A lat = plot.arange(-60, 60 + 1, 30) / c' v! T4 ?- s state = np.random.RandomState(51423)1 E% d3 g/ D( M2 {) t6 b" }" h+ B data = state.rand(len(lat), len(lon))9 P1 Z$ D2 o+ e: h- @0 B- J1 S; E " `' i3 B) I* R# P3 w; W plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi0 G6 Z1 A& C5 d! Y proj = plot.Proj(cyl)8 t2 [& d7 M5 h fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)( R: Y% y; b6 f0 m/ E" o z6 }; w" h) ~ axs.format(4 }7 U3 L4 l8 d1 k" _ abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, 7 _3 S2 z4 ~- S; ~ labels=True, lonlines=30, latlines=20, 4 i9 x: o+ I+ R coast=True,gridminor=True,coastlinewidth=1,: L8 W! q9 `6 L! h suptitle=Contourf,suptitlesize=20, ; L" K+ S3 L2 @% t# @; @ rowlabels=[Cartopy example], ! f5 H1 L) z8 O& ^# u8 @: R collabels=[Contourf, Pcolormesh]) U, w, Z1 K9 r5 ~2 n1 z! @; [ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度 : S7 ^% ~* r& b1 \+ W2 M. K7 E' d6 L/ R/ ^1 h m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)+ u; {& E- O: z5 b6 D0 `2 S8 |2 M axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)8 h& }* J, y E% T & j3 C) T" W5 V$ g" ^ fig.colorbar(m, loc=b, label=State,3 {; G9 i; L0 z. H" S" ? labelsize=20,ticklabelsize=18, extendsize=1.7em)7 j( V# ^1 p6 M- r7 l* }3 O fig.save(rC:\Users\59799\Desktop\image.png, . y, w' u' c/ I- M+ s# T* I dpi=600)6 h3 P1 ~7 N" P2 O# Y2 O n1 V6 f) P plot.close() ]& h, d5 i5 D" [/ f: l
$ @' ~! U, w0 N0 c- b7 u0 h% h
* h$ W; [$ m9 q5 `5 s8 N* r

②子图特殊布局:

. Q- g% f& [0 P( u0 q
import proplot as plot , W/ c' l3 H; S+ r) v! J import numpy as np2 p, r+ B0 s- K. V# }' [% W 0 i% d( R, p- c # 创建虚拟数据 6 G# V' i4 U6 o- H. a4 \ offset = -40 , R( f# i3 j/ A" L1 D lon = plot.arange(offset, 360 + offset - 1, 60)5 q$ J+ a6 l! |" E% p lat = plot.arange(-60, 60 + 1, 30)6 w% ?2 f/ p( ^ c- W state = np.random.RandomState(51423)7 d" C6 S, }6 t% H9 S* y data = state.rand(len(lat), len(lon))5 c3 G( ] y4 e" k+ G 1 X( g2 h1 c- \/ T% k4 d1 p3 x' q- { subplot_array = [[0,1,1,0], 7 g; ? Z! h/ A7 j6 H! q. l/ u [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...9 G2 |' s: ~3 z $ C% _8 S1 z8 f( u) J plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi3 F/ q. Z5 i1 @ q, l proj = plot.Proj(cyl) $ @4 {3 [- G+ `& e fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) - h3 l3 r& F7 d4 Y axs.format(9 o' o! P- K. k( h: Q abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, ' i1 I$ z# w+ p3 w labels=True, lonlines=30, latlines=20," G0 T: F" K0 d' X5 B ]1 ]: t) i coast=True,gridminor=True,coastlinewidth=1) 6 {1 J, a: g& ~9 C cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度, P+ T9 d! N) L/ q/ n" M ! D" a1 W/ b5 n0 w: n0 o m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 4 p( C# \% ` d9 T0 z3 E axs[0].format(title = subplot 1, titlesize=20)( R" U* O. g3 g/ ~$ } 7 ]7 x7 R* ]( o# _" H) ]4 L) p axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)6 n& `, }: }6 q1 a+ q d! |% p. j$ ] axs[1].format(title = subplot 2, titlesize=20)9 b4 B, ?/ R4 U+ u1 W 8 H9 U6 W; W9 J" F) X7 G7 H$ ]- Q axs[2].contour(lon, lat, data, extend=both)4 A$ K- j" U, I# W axs[2].format(title = subplot 2, titlesize=20) # J/ N! _) b3 i2 k: R& w' g' \# b+ n7 S7 d fig.colorbar(m, loc=b, label=State,& `) l% e9 p8 j& z0 ?! m9 Y* o5 y labelsize=20,ticklabelsize=18, extendsize=1.7em) 0 R2 t3 ]0 q$ o7 Z fig.save(rC:\Users\59799\Desktop\image.png, ]4 Z" S( |1 K% G dpi=600) & [1 X# {2 y1 U plot.close()
) g E" `8 x1 u/ ?
0 \0 e/ Q/ S. P: @2 q

使用技巧:

- j- T _" U F7 J2 t

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

5 @) K( D: t1 m; o

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

' n& x7 n K, [! b: _
axs.format(...)#设置全部子图 # C- M5 ~7 b2 g# ^+ O/ u axs[0:2].format(...)#设置第1张和第2张子图 D7 i ?/ f+ ? axs[0].format(...)#设置第1张子图
, [" @+ Y/ [5 i' \ F+ A; @" _- o

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

" O r0 M% |# S5 H ^" |

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

& i8 G2 g/ D0 K# x8 b0 o9 U 5 w! G6 a1 D* A1 Z' r* l+ l+ H1 b/ {: ?3 N" O / N8 S7 p2 f2 _ v" z9 q- l! V ' {# `) G, l6 V
回复

举报 使用道具

相关帖子

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