|
7 Q# n- A2 ]2 [3 f
Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。
5 @! \# y+ e: g4 V6 K6 w8 ?5 w 在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门: ' Q8 e( k6 }+ T5 m
# k2 E0 g7 T, }6 C" ]
不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。 " j3 G Y7 V4 Y4 E- `. n% ?) b* s2 b
一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)
/ i& V7 G4 C- f: [5 z& s; z 1 `+ ~" N" t) j) V- E. ~9 J9 E
在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果: 3 _7 |4 W1 K$ Y: L
①简单常用的填色图:
, q# z& _: Z+ s3 {1 e; t' H/ L import proplot as plot/ E% @3 S, e. r6 p8 ~# d# ?
import numpy as np
4 D" ]$ s4 }7 o9 `+ }7 [4 M: w% ~
# 创建虚拟数据8 X$ n1 }: S& |7 R: B
offset = -40 g; d# ~/ Y& R6 Q3 ]2 ]
lon = plot.arange(offset, 360 + offset - 1, 60)6 `3 K, X7 v& ~
lat = plot.arange(-60, 60 + 1, 30)
}# D) h+ ~- e5 m( u state = np.random.RandomState(51423): n; K x; _* j$ q8 w
data = state.rand(len(lat), len(lon))
5 `7 B: K% J( G% t5 i
' G* J; h. a2 y$ ~' N: ~ plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
) |! C0 e6 U: N proj = plot.Proj(cyl)& T+ k8 | Y! C" u4 Y
fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)3 N8 V( h) O4 J0 n
axs.format(
) C+ |2 B0 o7 A- m- o9 N1 X abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
; N$ _9 A7 x* [0 S0 i8 W labels=True, lonlines=30, latlines=20,
5 w& H+ m! j% P" { coast=True,gridminor=True,coastlinewidth=1," A6 `+ e8 b# v9 U3 }
suptitle=Contourf,suptitlesize=20,+ i8 h) S5 U( m& V3 `) F
rowlabels=[Cartopy example],
8 r3 P4 }& G" X$ d4 K# B9 D. R collabels=[Contourf, Pcolormesh])* v- P4 W0 L- B" B, Y5 @: L/ |
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度5 K9 o9 X1 q4 N* v& ^
9 T* W' K# g. y& t2 r
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)1 X' {5 Y" H, l# }
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
2 Y' Q2 W% {) O& X/ E' v) c5 d5 ~. Y! h& }3 n) a' ~- D% O
fig.colorbar(m, loc=b, label=State,
- J$ V {$ ?1 s; o* `" F labelsize=20,ticklabelsize=18, extendsize=1.7em)
' m4 b, s( A+ |1 e fig.save(rC:\Users\59799\Desktop\image.png,( Q# S# X2 ?! d8 \& O
dpi=600)
6 f2 I" Z' U# ?) l& E( z plot.close()
|9 {, f) i3 T3 |7 T; k3 N$ i6 ~ ' f2 N8 ^' V- f0 j
& T8 w0 R/ w; d: F7 O ②子图特殊布局: " S i! U& F8 H
import proplot as plot
5 W+ i3 E8 q0 G* Y2 c1 n& w import numpy as np
5 Y0 y. C9 f5 x% n+ W! M/ ?, \8 s4 t/ M$ T& t, s
# 创建虚拟数据9 p' D* B0 R) x D+ R- E5 w
offset = -405 K1 V4 [( u3 R7 v
lon = plot.arange(offset, 360 + offset - 1, 60)# L, _+ W+ s5 r. Z( x
lat = plot.arange(-60, 60 + 1, 30)5 b+ y- i" t( u# C3 o
state = np.random.RandomState(51423)
& O! M# V# p1 L7 ~ data = state.rand(len(lat), len(lon))
# B( E2 l5 i2 ^( j9 Q7 z. L. m$ _7 v* [0 k
6 S/ W: R- v* G2 [8 {* s
subplot_array = [[0,1,1,0],
0 f- e" D: ]8 b7 X+ R# d [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...
* K; W, q9 m- J, d8 H7 ^' w- L" C$ M! a* _+ N, \& L8 ^
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi! A% E3 ?) x9 @! U& q
proj = plot.Proj(cyl)7 m% F4 p2 X/ i( q
fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)
% d3 L8 W- `+ S1 `" m axs.format(
2 y; \4 o- i& n; o" }/ F abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18, X9 m' D3 M+ N# ~
labels=True, lonlines=30, latlines=20,
( k, X8 K' U. O3 [ coast=True,gridminor=True,coastlinewidth=1)- f/ Q+ O7 j) ?. k
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
0 D) ~2 o* H6 h) O9 I7 J/ z
+ Q5 `3 n" |+ u3 t4 ? m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
9 w! b+ R1 n2 A8 Z) j( ~ axs[0].format(title = subplot 1, titlesize=20)
6 |/ l9 I% O f1 |9 z7 Y4 t0 g; A: q: a: N0 d
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
/ `9 C; V$ Y8 O4 L axs[1].format(title = subplot 2, titlesize=20)9 m1 Y& L& `( O) ]
& [9 G7 n/ M" \+ d% W! `0 v; e$ ?
axs[2].contour(lon, lat, data, extend=both)# @2 \& a; ~$ [* \0 o
axs[2].format(title = subplot 2, titlesize=20)
) c; H/ a5 K4 ^& x, _3 W/ G/ d! C4 U) L# K$ x
fig.colorbar(m, loc=b, label=State,
& L3 `8 f9 B3 [ J D+ s2 X! e; {6 b labelsize=20,ticklabelsize=18, extendsize=1.7em)
" u0 s1 f# A& e fig.save(rC:\Users\59799\Desktop\image.png,: G7 E5 |: {8 V5 s4 E
dpi=600)
" R5 N y9 K4 `( L. a& V# ] plot.close()
) O9 z# j" u$ i5 x1 u
6 S0 D7 Z$ j0 V! M 使用技巧: 2 }0 Y( S3 [( U: V& T
①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。
( L& i5 o% k. @4 f4 {* h3 {" q ②format方法可以针对不同的子图设置不同格式,例如: 1 U+ {% }1 A+ `
axs.format(...)#设置全部子图
8 H8 q( ?4 x4 C4 o( r4 g9 f axs[0:2].format(...)#设置第1张和第2张子图5 g0 [& Q" J0 F4 W
axs[0].format(...)#设置第1张子图 - \- q+ O! M1 B* j8 ]% N
③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节
8 X& A: k$ [* d! H8 z0 Z9 z2 p ④现在Proplot中还包含着basemap,个人不太推荐使用。
+ O; O9 |* Q3 Q2 d7 v0 r9 N h
* M% H: Y h2 J6 y9 }
$ |- F! d3 y5 s0 A r; B) T+ g+ w7 Z9 ?( ^
& L' i; b" _) d8 ?% i! v
|