|
) c% \: m- u5 I# b
Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。
& k; o, d& _( \* z+ | 在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门: ( d: |7 J) p& A& f5 L, n. M
5 G- P8 T6 I1 v5 V8 c3 P 不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。
, }* T# ^2 h `; w7 r 一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)
9 W9 _; ~6 L4 M; [2 @5 ]- b % m$ C% |% p$ D) u* s$ b
在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果:
; X- v$ o, ?! o ①简单常用的填色图: . y" K$ m6 t# v7 ^
import proplot as plot
e9 e7 F! |8 G import numpy as np
" c% f" c& J m0 {4 i6 {' z
C7 ]. W. N C% Q) A7 X. E # 创建虚拟数据
2 j: V: D, W/ S' P9 f% J% { offset = -40
' J& t+ S' q6 v" y( U1 M* V lon = plot.arange(offset, 360 + offset - 1, 60)
: C( m' D6 ?; N6 { lat = plot.arange(-60, 60 + 1, 30). q0 ]/ y* |8 s! V$ P
state = np.random.RandomState(51423)
8 F6 ~1 O! ~0 h6 X: h- @# @. L m data = state.rand(len(lat), len(lon))$ |. ?- M" z3 M' f9 g! K
5 H, x- X! f! F1 N% T
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) ~7 ?; C8 |( a
proj = plot.Proj(cyl)/ H% J8 l/ g' O/ _' [6 e
fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)
# y: L' L) T! Y% A$ s/ R axs.format(% j8 R- R2 C: C4 o
abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,4 o( s/ X% O l4 S' W' n1 x
labels=True, lonlines=30, latlines=20,
) j# x2 `* \$ w |: B coast=True,gridminor=True,coastlinewidth=1,
+ s+ ~5 h6 Y, Y4 k$ q/ @, O& n suptitle=Contourf,suptitlesize=20,
) K3 b. s, x9 o: }7 ~3 a rowlabels=[Cartopy example],
% D/ m$ D& q, Q7 ?: B collabels=[Contourf, Pcolormesh])/ \. K9 M1 A2 d5 O+ S- v' t# S
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
2 {2 o+ f, P# U- z# v' E; v. l: T
* L }& d& q! p7 X; J* }4 l m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)0 T, L: u9 w- h. [$ v
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)' r$ ^/ x& `8 |& k" B- ?5 y/ P
/ n( C) u- X( {6 X) S
fig.colorbar(m, loc=b, label=State,
2 o m* _1 ?! [' b6 x$ M* r labelsize=20,ticklabelsize=18, extendsize=1.7em)
: l8 a) J' R. z7 v: W fig.save(rC:\Users\59799\Desktop\image.png,
( i9 H9 y1 A+ u1 _, H7 y' { dpi=600)
! q% m- p" q. ~ plot.close()
0 L! Q: @# Y: R1 k 7 X4 n/ n5 w4 A( c; w7 W4 A
- r" ^/ Z$ D; v ②子图特殊布局: * C+ `" a4 Y+ q T* h
import proplot as plot
) c: i$ F7 n' K, t. ^& h: e import numpy as np! U- }/ g, ?5 ?6 e! o. \
9 C; J# g: ?$ h7 j. E0 \& e # 创建虚拟数据2 z7 L& a5 r5 G, N* j8 A1 p" t
offset = -40
w. y* R+ v! u0 R" b lon = plot.arange(offset, 360 + offset - 1, 60)3 u2 Z6 A: Z K6 j4 P+ v
lat = plot.arange(-60, 60 + 1, 30)
( d9 g! |) h' i9 B5 ?9 L& x% c state = np.random.RandomState(51423)
* u( R7 Z* \+ e5 y2 |; f. d data = state.rand(len(lat), len(lon)) z7 w2 l( }+ S2 C
( k5 G, ~0 b( C5 Z5 w" w
f, w6 W0 r) Z4 {9 s' o! t7 G subplot_array = [[0,1,1,0],* `. y4 s- Z4 q; d$ e8 b
[2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...
9 a% ]+ f" ~+ V6 b2 k# ^% [& X6 B) }5 R3 {
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi* l- I4 Y4 q5 d- O: n; p
proj = plot.Proj(cyl)
5 t3 L. P9 E$ m8 r+ W fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)
4 i7 M* c+ {- F0 S% d0 O' C axs.format(
2 M2 {& s8 e: U abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
- `1 ^; d2 j* a I! I% D7 @! h labels=True, lonlines=30, latlines=20,+ T# C! c& c1 u+ B. g5 a
coast=True,gridminor=True,coastlinewidth=1)
8 [: m1 Z5 y1 Y2 h/ c9 G3 a cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
+ }: D6 P5 q B) L0 H' a g; F
4 k/ k }6 m! F% X2 \1 z5 t m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
: j" g& _/ c& q/ x axs[0].format(title = subplot 1, titlesize=20)
* l% [6 t; g! ? X7 K; Z! a7 s# \# d) d: V% W4 v
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
' |+ k ^4 Y! D$ s A9 Q1 l1 v. k/ D axs[1].format(title = subplot 2, titlesize=20)) Z6 C, S: Z2 a8 B' Y4 S$ m
1 q5 Z% W/ _) p$ H% F4 R, z a axs[2].contour(lon, lat, data, extend=both) A1 ^( S& w F& V5 O( z' A
axs[2].format(title = subplot 2, titlesize=20)$ j+ \% d, q) k2 [! |+ S3 {- y
# y n& D+ V- I8 _5 x( N- w
fig.colorbar(m, loc=b, label=State,: w/ N& |" g" W. t; e2 t0 i
labelsize=20,ticklabelsize=18, extendsize=1.7em)/ K% g+ _ A+ r. A
fig.save(rC:\Users\59799\Desktop\image.png,% _/ Z7 U' [5 A3 W
dpi=600)
4 e# x# o' W% X2 d plot.close() 0 ]( T8 i4 V6 L f5 x
0 C# q' n# Y/ @& k4 O' [
使用技巧:
4 i0 U4 r0 p5 L. O; C) [7 \ ①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。 ( a3 P s: s6 i0 P8 y0 l
②format方法可以针对不同的子图设置不同格式,例如: * ?5 H9 A' Q" ?/ X5 t6 ^7 A
axs.format(...)#设置全部子图
3 C# P9 r6 K3 }$ D( N- Y axs[0:2].format(...)#设置第1张和第2张子图
& y0 q+ c+ e( h axs[0].format(...)#设置第1张子图 7 t+ A9 @0 \/ _
③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节
b8 A" H0 B. W2 `6 i! \ O ④现在Proplot中还包含着basemap,个人不太推荐使用。 6 h; ~5 {1 v; U8 e
7 Y v2 u o) B1 B+ L! y$ I9 U8 W$ r" `6 ^9 n6 S
% z! c/ c1 {% L
, @, X7 i$ n# y
|