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

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

[复制链接]
9 [2 ]7 D7 C; N& m; y; W8 h$ F$ e

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

0 g. G9 {( k# H! h$ f* |: x

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

0 H6 z! K& g$ h$ i % i4 a( I' |" |) c# @# K; S

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

1 {( f, e+ B' f2 E& j

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

; G$ x3 E3 y6 v: a' P , O$ @* d* `( j0 H

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

: I4 l6 e w; U5 S

①简单常用的填色图:

3 H9 f! ?/ ~3 `6 R- U) ]) \/ c
import proplot as plot * k6 ~# Z% ?5 m import numpy as np2 i' j. z: \$ A! E9 v) |$ ^) s ) } m) ~8 l' |* i' f" q |# k, Q # 创建虚拟数据, C" p6 f7 B- E offset = -40' Y& t4 ?' T# w" c lon = plot.arange(offset, 360 + offset - 1, 60) 4 q9 h* ]+ s9 P- m! o! @) H, b lat = plot.arange(-60, 60 + 1, 30) 1 v$ v/ D; N1 X( p9 j state = np.random.RandomState(51423)' {7 B: O, ~2 d# x% s data = state.rand(len(lat), len(lon))3 Z" w# X( f p+ A0 A, _& t& e - e( W4 i$ c( e2 m% R plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi4 u* ?$ K9 q3 { proj = plot.Proj(cyl)' r, ]+ ]. `& |, F/ T! I fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj) ' A! k# ?) K) D; `1 }8 o6 _% A7 o axs.format(4 Q, A) k$ X+ `# K% a1 r abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, & J( g m! D6 q# l8 f- W9 p% S! o4 v labels=True, lonlines=30, latlines=20, 6 j5 W7 ~8 ], \+ j coast=True,gridminor=True,coastlinewidth=1, % ^) v" E& C9 U/ K# \, @ suptitle=Contourf,suptitlesize=20,$ @( x- B/ R/ Q# l1 [/ f; K! W rowlabels=[Cartopy example],1 N& E; C8 ?6 Z3 A2 X: H collabels=[Contourf, Pcolormesh]) 6 ?6 O7 C, L6 m cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度8 D) m4 ` W% m& ]" l7 W $ t0 M4 S4 q: P" q$ f9 s, n) Z$ a m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both) 1 n* ?; x2 E' B8 ` axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)+ O% l& J( a" w& z& r' u $ [( r0 |6 @4 s4 H5 p# I fig.colorbar(m, loc=b, label=State,9 T! l( O' _0 C7 X" ]0 q' `; ] labelsize=20,ticklabelsize=18, extendsize=1.7em) ; M c0 G9 o+ L4 m) \) P" F fig.save(rC:\Users\59799\Desktop\image.png,6 I/ }3 v- m0 i8 R0 D dpi=600)6 p6 M7 u3 A$ f6 U4 I, L plot.close() : [: W7 s7 B# O7 y1 m
5 [+ Y; Q4 C+ k5 E+ o* h
3 x& u Z0 j& o/ b) w M( o

②子图特殊布局:

5 \0 `8 M( j# k+ z( P0 l j
import proplot as plot: n9 f) H) b% z( q8 B) a import numpy as np% I y4 y& F) L ( c$ R _. |+ |: w% l* p # 创建虚拟数据8 r$ m# r; U/ `0 |) t4 J, A offset = -403 }- m d, X9 A; V { lon = plot.arange(offset, 360 + offset - 1, 60); N0 B- L) n; J" W5 E lat = plot.arange(-60, 60 + 1, 30) # u4 D- B6 L- |8 b0 j9 L state = np.random.RandomState(51423)7 }. g7 k7 F7 O, N. p. F data = state.rand(len(lat), len(lon)) ) _/ d/ `% W# w3 Z, _1 u- v# y7 S x1 U; V; K5 j! n 4 n% s" s# w6 S" N& R subplot_array = [[0,1,1,0], 1 c, s5 n6 L; ? [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...- y0 m" B6 k" I3 y0 _ $ Q' D& y; u. T, n0 J6 g plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) W$ S) ?# K9 M+ [3 v0 X4 \+ L: n- e0 e proj = plot.Proj(cyl)2 }5 s8 ~0 x0 C. | fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)# `& I! g- L- P; E axs.format( + R0 Q/ j i& }0 ^4 L; M abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,: }* c9 @0 W: I0 g labels=True, lonlines=30, latlines=20,& Z* A& E( W- w' x+ S" F( Z coast=True,gridminor=True,coastlinewidth=1)- `3 I) b+ S' `8 w1 I0 S cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度/ y8 O/ {* T- p3 B5 c- W " g5 o) P, p f. Q m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)0 _6 ~/ r% c) o' t) o! {/ Y axs[0].format(title = subplot 1, titlesize=20)4 b, J& @9 g4 E) [; T$ f . ]3 w% \3 ^2 A, ^7 C axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) ) C- Y& `; ?4 Q, h8 f' h, \ axs[1].format(title = subplot 2, titlesize=20) 9 r4 V' M8 |% {6 T* k4 _1 r. Y& {3 F6 L0 l axs[2].contour(lon, lat, data, extend=both) 4 U0 }$ N6 c5 w- M axs[2].format(title = subplot 2, titlesize=20) $ i% m5 q) o2 [; c0 [- ?: V5 L% t1 J% o9 T9 a) A8 S3 V; f fig.colorbar(m, loc=b, label=State, : \/ E2 f G; g/ p9 q( ^ labelsize=20,ticklabelsize=18, extendsize=1.7em)' T$ e- v9 ]3 Z6 }8 v) j) \& k fig.save(rC:\Users\59799\Desktop\image.png,! n3 u- D7 O5 _6 r8 O* e3 O* P dpi=600) Y7 ]' D7 G7 N( V plot.close()
. u7 G5 a2 R# |. T5 o+ I; P }
: D, Y, G; @# ~9 z) L4 s

使用技巧:

( O9 u F! p$ L) j) O- I

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

5 S2 A! V4 Z2 r5 @3 Q

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

- W- Z% s% z% z" u9 V% T9 ?8 C- }% n
axs.format(...)#设置全部子图( l- u% r' m) f% a2 C+ O: l# _ axs[0:2].format(...)#设置第1张和第2张子图 5 e9 {+ ]' m! c axs[0].format(...)#设置第1张子图
( k4 ?5 A' \- P/ a

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

% w& q$ ^- C( C$ x6 D

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

! l B" m. M/ X' a! R0 M4 B' h0 B& `5 U; @" f1 o 0 n0 s" s5 ?' s% b6 I0 A- f& k; n$ m" Z5 o+ Y& [: K2 m 6 X9 |, c* ]& v- ]4 g8 f7 h/ k
回复

举报 使用道具

相关帖子

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