|
, d/ |7 B0 a* f; U Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。 . Q ^+ F6 O% b! X9 d0 O
在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门:
4 }! f4 r, S0 s% h) r$ N1 x ! w7 W( O; s! G5 }" t; ?
不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。 % z: d' S, Q2 G9 X, A- J) E
一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形) 0 a( V9 t: R2 p. u% A T6 \
: q- {* m) D5 O8 }' V( x4 F 在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果: * E3 f* M5 t- q
①简单常用的填色图:
: @4 `5 [6 E! Q5 o( n \ import proplot as plot
9 f" x1 t' W* Y% S+ z import numpy as np
8 l! B) c6 a \* f# k
- M4 o4 R/ y; ?* w }9 u% v) l # 创建虚拟数据# N0 ?! {5 J" |0 t
offset = -40
5 @$ d) B" t" u lon = plot.arange(offset, 360 + offset - 1, 60)
# W. z8 u6 A+ L% l lat = plot.arange(-60, 60 + 1, 30)' B0 L$ n% `7 ^. N# H
state = np.random.RandomState(51423)
+ ?% z. ?1 ^7 } data = state.rand(len(lat), len(lon))- J0 x9 G" j0 M
( A+ e; r# H$ z! M0 ^+ y. e+ E plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
4 f' X: i/ R+ V. O" I proj = plot.Proj(cyl)
" c- a# O4 P6 `! C& E fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)
0 M; u% w" m$ S# e# T axs.format(
2 T# o- \4 i3 K1 j, } abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
, S" C+ n7 [% o& m" ^/ K labels=True, lonlines=30, latlines=20,
1 ?2 R5 N7 @/ ~; r4 f" a9 v coast=True,gridminor=True,coastlinewidth=1,9 K; M& g S6 a/ e2 l
suptitle=Contourf,suptitlesize=20,3 P3 | E5 }& Y& y
rowlabels=[Cartopy example],
; m* H9 i" G+ L- D" i3 w collabels=[Contourf, Pcolormesh])3 u# s' M; F7 a
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度: ~% }4 z Z- }
/ n" R: B9 p5 ]- _
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
! t% X9 J) a1 \* g4 I' ^( J axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
2 k0 I4 ]: o4 {+ l" ~8 S$ R3 n
) _% @2 j. z9 c. K& \ fig.colorbar(m, loc=b, label=State,
4 M, q( U: z9 [8 r4 `5 i$ n6 P labelsize=20,ticklabelsize=18, extendsize=1.7em)
, ?# V! V6 c/ X& U) H7 k fig.save(rC:\Users\59799\Desktop\image.png,% c6 ?4 s3 l) K" ?' n" Y7 R% F
dpi=600)
$ z; \" g z: s" x plot.close()3 Y& k( a# ^3 K/ L: I5 p, N
; e9 ] }9 F( h* \1 o* Y$ t / i5 u. `1 E9 \: ^
②子图特殊布局: ! x c: @ f ]- w
import proplot as plot. t) ^* [5 C- y2 j
import numpy as np
: H1 J: L: ^( } V& T9 n* }' S: J7 G. ?9 y
# 创建虚拟数据
( w$ @; m! E2 o( W1 e0 b# k offset = -40. t- ] k) Q; v/ x- b: m3 U+ S
lon = plot.arange(offset, 360 + offset - 1, 60)
. h( o# U0 T( t; I lat = plot.arange(-60, 60 + 1, 30)
n: x, @5 s) a7 C3 ^ state = np.random.RandomState(51423)! `% { h6 _1 s! I7 Q" g7 O
data = state.rand(len(lat), len(lon))% h7 m* U. O7 ]2 \% e
( ~) v/ ]$ z$ T' A5 W; R2 Q
, [5 B: N% R8 q' I' T subplot_array = [[0,1,1,0],/ Q V- C& ^, m" S0 ]
[2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...- B8 I% l' U7 o2 N5 n H+ A: m5 C
1 L ?& ?% i7 w! `4 \; h plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
! v" G# |' `) ]6 Q! R5 C proj = plot.Proj(cyl)
6 v2 e4 I3 N1 w% L7 U3 [ fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)
7 [5 K8 c$ Q, R; l& m8 T0 _ axs.format(. H, r! _9 N- V5 h$ p: y
abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,. o; X0 b6 R' N P$ l) M; S
labels=True, lonlines=30, latlines=20,
/ ~5 u' }# r1 s( F5 V0 k coast=True,gridminor=True,coastlinewidth=1)2 @# r; u8 H: w Z$ F' G
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
' h/ [ K9 Q( m# y0 m5 [/ L2 x% N$ f8 g8 ~
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
% d: k; A6 ]8 f: ^ s& B$ E axs[0].format(title = subplot 1, titlesize=20)
* H e& c+ K, G0 ~ P, n7 ~7 [# i, C% g/ e! H
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)
" @; [7 m/ v/ R$ E+ N5 X2 } axs[1].format(title = subplot 2, titlesize=20)3 W. k( {/ _% w
- l' \ W9 e, a
axs[2].contour(lon, lat, data, extend=both)5 w% [1 K: z7 n' Z8 g
axs[2].format(title = subplot 2, titlesize=20). |& \8 ?. A3 Y2 C" e9 j
* K4 ~' N2 L2 ~0 A, j, }7 g
fig.colorbar(m, loc=b, label=State,
k3 U9 w3 z; ] labelsize=20,ticklabelsize=18, extendsize=1.7em)% d; }: d3 ]8 Y
fig.save(rC:\Users\59799\Desktop\image.png,
/ A/ C) H. p1 U2 s3 R dpi=600)
1 Z1 }6 @$ Q3 R4 | plot.close() ! T' ]' C+ T& p' o, Q( B
' b3 F2 C$ Y4 m, r _5 c
使用技巧:
1 j# \" m& I* N% o9 @/ O ①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。
e8 u8 `9 D7 a0 t( }! _8 | ②format方法可以针对不同的子图设置不同格式,例如:
6 Y1 ?- u" n! k3 S axs.format(...)#设置全部子图
# B4 }1 f# i4 X axs[0:2].format(...)#设置第1张和第2张子图: y/ V: B3 i* b( O) e; a
axs[0].format(...)#设置第1张子图 ) y+ X0 ]# Y( Z+ a' [
③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节
& g/ M+ d5 j2 m* | ④现在Proplot中还包含着basemap,个人不太推荐使用。
3 B8 j5 h2 r: ]' R1 ~5 D0 F- Z. l9 }6 j# O
) p1 R# o; d4 [% Z. i$ S3 ^) |
: |2 c" e D& N( s) s d0 Y0 s, X& d! x' e
|