|
+ K$ L: P3 D, T- _# N
Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。 * p0 t% ~; n) P# B+ _
在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门: - a- j% D4 X) {
: H) }/ n: [3 b* ^. g 不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。
+ d, { A3 E) D8 p1 H: ~" w- m2 u 一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)
: [; r& u, u% H% o, F
! J: u+ N6 \' t 在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果:
+ D# U. c" D) N& z ①简单常用的填色图:
$ E6 b5 {1 U5 S3 Z Y) a import proplot as plot4 J! Q7 C# o6 `" V+ J8 H4 K* r
import numpy as np$ |% o5 a% [4 U
4 h/ [1 f$ z( B # 创建虚拟数据- c- d% d) Z. }5 u' P/ a+ B
offset = -40) `2 S' [: {3 M& a: p3 B9 C0 I" M! q
lon = plot.arange(offset, 360 + offset - 1, 60)
3 n7 Q9 h3 w5 q( m lat = plot.arange(-60, 60 + 1, 30)
, [% G# j% s4 O2 w0 c! [7 \; ] state = np.random.RandomState(51423)
3 M# y" q. y, e data = state.rand(len(lat), len(lon))
" B8 q+ r1 w% B% N+ m
6 v2 M/ A4 m1 \) a3 c plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
- W) s7 ]# o! J0 D proj = plot.Proj(cyl)
$ k) X# e8 ?4 _2 }1 A9 n fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)
, q( t" I, | V axs.format(
5 O a. ^3 U8 ]/ `1 j6 @ abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,, p7 F9 P1 A& Y) N+ c
labels=True, lonlines=30, latlines=20,' f9 J$ Q' J* Y) p. Q
coast=True,gridminor=True,coastlinewidth=1,0 S+ {; R( q- B# G; r. l
suptitle=Contourf,suptitlesize=20,& s# C) t6 _4 j3 }' _- f
rowlabels=[Cartopy example],( \2 a$ n5 v8 N' [; f- @
collabels=[Contourf, Pcolormesh])
* i. J! l; H/ m0 D" Q cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度) w2 o/ ]; ]( K/ t
5 ]. N. B1 l6 d2 w
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)1 l' Q' K+ i* D- A, p
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
( }% f4 v. p2 c2 k" b: O ^7 z$ t3 T1 [" R9 m' D8 a7 _- v
fig.colorbar(m, loc=b, label=State,! d7 q" [" Y0 w) x$ {; y
labelsize=20,ticklabelsize=18, extendsize=1.7em)
. q, |" z! R: Q2 g1 u7 P& z& n+ _ fig.save(rC:\Users\59799\Desktop\image.png,2 O+ R4 A2 m$ r$ U- N7 a# ]
dpi=600)8 m; X' S3 V! P
plot.close()
' z. D4 j3 u- E4 M2 I2 y7 T" c $ S; Z, J7 ?7 A, o- ~, {
+ F3 N$ g8 O$ }) N8 D' L7 a+ v0 R( W5 l
②子图特殊布局: 7 @# t1 Q3 @6 p- e) C7 l& w6 O, L
import proplot as plot* D. Q8 s6 T( |' u- M% t) A
import numpy as np
5 A9 `- z! |9 W
% U( y( s$ s5 p4 u # 创建虚拟数据
; H+ [ _0 M- M4 t offset = -40
6 ?; i/ Y0 R' u- T3 c- u0 e lon = plot.arange(offset, 360 + offset - 1, 60)
, m0 V4 N( _0 e4 D- H6 N& E1 p lat = plot.arange(-60, 60 + 1, 30)
4 {9 w7 R+ [; Y; N8 { state = np.random.RandomState(51423)8 t: p. l2 t! o- Z! U7 D
data = state.rand(len(lat), len(lon))( W$ V/ {2 e0 A& Z# c( y. R
' W+ u# c1 F' G* E. N1 s6 x' m: x* }9 V6 e1 ?) m4 C3 \7 M+ Z
subplot_array = [[0,1,1,0],
. w, q4 `. h& F- J- p) k$ Q8 L [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3..." _! p+ ?1 {+ a
1 c7 C" a5 J. G# z% T) k" w
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
6 }2 K( I& ~ I& X# X8 r( v proj = plot.Proj(cyl)
% y2 d! _: H/ j fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)
7 n" b1 |3 o7 Q& ` axs.format($ f3 g- F4 B2 T0 h% J; K" H
abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
4 n3 C% X5 M/ r* L. L, u- f labels=True, lonlines=30, latlines=20,/ ~- m; R. e' \2 Y4 x
coast=True,gridminor=True,coastlinewidth=1)
9 I; m% ~& F, c6 {, M. ^ cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度% X: {+ I! ?4 e7 g- j! x
) F5 |; e) u9 {+ v3 U- h m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
$ w" S: H# \' f axs[0].format(title = subplot 1, titlesize=20)! O3 c1 o" J) D1 ^$ O
. g0 r4 t* W! r2 I6 t
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both): j: C# w6 e! }# o/ W
axs[1].format(title = subplot 2, titlesize=20)9 Q8 h# ~! l' A; |+ l% e9 k
# t) E' i4 a. k+ J# ~5 W: P7 [# }
axs[2].contour(lon, lat, data, extend=both)
$ X; |# Z' p3 K3 a+ h axs[2].format(title = subplot 2, titlesize=20); f# D7 H, m L( A% K8 C' c
; \+ B5 b* X. I3 Y$ Y fig.colorbar(m, loc=b, label=State,( D1 s h% d3 b
labelsize=20,ticklabelsize=18, extendsize=1.7em)
1 H, {& W& ? Z" f fig.save(rC:\Users\59799\Desktop\image.png,
0 W9 P1 Y6 B7 q# p- @/ R dpi=600)" \8 @+ g' N; s8 ]$ ]3 ?, ^9 t
plot.close()
. c/ C1 ]" x. M2 X* D n+ x
* x+ k% |. J+ @& X) f 使用技巧: ; x- l& q4 S8 Q1 [
①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。 ) m' ~, q3 O2 T
②format方法可以针对不同的子图设置不同格式,例如: . A) K. g; v2 h7 B
axs.format(...)#设置全部子图+ |& {$ r; X8 Q0 A6 K4 |
axs[0:2].format(...)#设置第1张和第2张子图
/ F T% c# C( Z+ B! L8 i axs[0].format(...)#设置第1张子图
2 K2 x2 a' k! [2 A+ U; } ?- _5 E- Q ③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节 + c' s( n! a/ o1 i$ L/ p2 g
④现在Proplot中还包含着basemap,个人不太推荐使用。
4 I# f' k: f' c! h& \2 b$ l6 A# `8 l3 R" C# W/ W6 B5 F
9 y; [ h* z4 n9 Z! p
! `5 \# O" i( Z% u6 P
' \" h+ G+ s. B5 S/ p! b
|