|
8 m, U0 D0 I( ?; T) y( E Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。
- c& p" K: d& a1 k- @; _+ w& @ 在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门: ; R& v1 l x& s# _9 o' R$ a7 r
% D) |6 ~) H3 e, P) k3 W) S 不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。
* I" B( d5 t/ e- L# n' I) b 一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)
( S6 }$ M A! x2 y/ C 1 g/ Y* f/ ]4 V
在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果: * o4 d5 f8 ~, ^7 h
①简单常用的填色图: " \0 X" F. G" x7 b% j
import proplot as plot+ t) G+ h2 D: x4 Z" m" {
import numpy as np
9 Z* e) E& S- d
5 |% P8 K$ K% N! U" M7 r. b/ o # 创建虚拟数据1 ]6 G" ]7 k) t0 X1 z
offset = -40
& p' \, F5 U Y. J {8 b lon = plot.arange(offset, 360 + offset - 1, 60)3 w1 U; {7 x7 K, [) r
lat = plot.arange(-60, 60 + 1, 30)* \. J/ P* G7 i# g
state = np.random.RandomState(51423)9 I6 s# \5 k; s. t' g7 |
data = state.rand(len(lat), len(lon))6 a5 S) q1 U/ ^
1 b2 t r$ B/ `: ^
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
3 _4 ~' H1 _2 m6 h, x proj = plot.Proj(cyl)
0 ]2 P1 T8 P) P Y6 S( J fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj)
2 _. \5 u4 B; |6 B, s5 \! A0 K. V axs.format(
' `+ K3 k( G1 Q abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
% i6 b' c. h3 h5 k/ F labels=True, lonlines=30, latlines=20,4 Q2 i! f" u: ]/ ` e! c4 c% m5 ?
coast=True,gridminor=True,coastlinewidth=1,0 d; S. W1 ?; o$ `% B
suptitle=Contourf,suptitlesize=20,1 O, ^1 R. Y6 E. \: u
rowlabels=[Cartopy example],) k7 C. [; O( ]) m, a6 P' _0 R
collabels=[Contourf, Pcolormesh])
% c% Q/ |8 B c) K( |; J; D cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
+ \3 d7 I y$ k/ f3 z& x9 K# m* I7 e" D# Z9 }
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)( k; k# G1 \* r+ O6 M9 D! A
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both) o' b) B- z& @9 a$ @
]9 y$ M, S, H7 n' R+ {
fig.colorbar(m, loc=b, label=State,
( l5 a- D. Q/ d6 m0 @ labelsize=20,ticklabelsize=18, extendsize=1.7em)
$ G& Y' Q8 T& H! |4 N2 k fig.save(rC:\Users\59799\Desktop\image.png,. U8 T0 N* h- c
dpi=600)
) o, z" Q* e. p& |6 l plot.close()
4 C3 ?& e) S2 y, a$ P , J7 U$ n5 F9 r+ ~6 l! Y& C
) o1 l ^+ m1 [( z! R9 _' ?6 l4 ~
②子图特殊布局:
4 k; U1 c9 B" b8 H. h, K3 Y8 ~1 L4 y import proplot as plot, I# o6 A8 K% y. Q0 d; [$ ?
import numpy as np) S1 Z8 E* n2 U% W- ?' X
( ^) \ H4 W+ C2 s! Y
# 创建虚拟数据" \8 _( d! U. a9 {* z( Z; g
offset = -40
% q- S+ ?, }8 R6 j0 | lon = plot.arange(offset, 360 + offset - 1, 60)
* k/ q6 i/ P+ `* ]) S, U lat = plot.arange(-60, 60 + 1, 30)
1 n( x2 m; Q. r/ q" ?( |. S+ u state = np.random.RandomState(51423)
4 F1 l5 A7 C% _2 u# [& j data = state.rand(len(lat), len(lon))
* E G! L& U5 s' F8 Q% ]: ^
# P1 y c( F8 q
* j k/ a) B9 \ subplot_array = [[0,1,1,0],
: x+ \- w$ G( K" ~- X5 A, S" u& R [2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3.... p6 X/ x: p; U! F+ S8 F6 `
6 U1 R5 m9 N4 m% r2 K0 d% v# L plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi) y2 ~ o: O4 @$ J: A" N8 C b5 x
proj = plot.Proj(cyl)
% u$ E1 h s& {2 B1 y fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj)
1 H; ^+ i$ ?8 e$ l8 t" T axs.format(
6 w' X$ I" x* t& M abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
- L& [3 C7 A9 R labels=True, lonlines=30, latlines=20,
' [% P, q+ D) _ coast=True,gridminor=True,coastlinewidth=1)
& B# L0 {: b. p5 `) j" i: u, n cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度
4 e# `; r9 n3 \" W4 I4 I, b0 c! e N1 [7 d; P
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
2 P# H6 D$ \. W% h4 Z& T$ e axs[0].format(title = subplot 1, titlesize=20)! q+ S/ s0 K# R+ F a! |
2 G" F! s- m/ Q, E8 l axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)# Q0 k) H- N1 d. s% K& g
axs[1].format(title = subplot 2, titlesize=20)
' |' J- L' x; D# j2 x0 O: O. W0 a/ J
axs[2].contour(lon, lat, data, extend=both)
( x$ _# V( Y2 | y, i axs[2].format(title = subplot 2, titlesize=20)
0 g' ?1 q3 U! e8 x+ ^3 h V# l
t* R8 e1 E8 X w fig.colorbar(m, loc=b, label=State,* Z& k" I H& D V% b6 G
labelsize=20,ticklabelsize=18, extendsize=1.7em)
/ ~* B( W# v6 o+ `* I! h fig.save(rC:\Users\59799\Desktop\image.png,
2 m) w1 K8 ]6 A* y dpi=600)
* O: T6 O2 Z1 h+ g. G5 ^" P plot.close()
/ l6 g' ^ t" ~+ R8 R# R+ Y / _ b& K: n$ o% A2 V
使用技巧: ) [, u5 o% ?/ O3 W+ w9 D
①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。 9 `* o4 S7 v4 d' B% f
②format方法可以针对不同的子图设置不同格式,例如: 2 I8 b7 J6 b; o
axs.format(...)#设置全部子图
+ L" c" C9 ` R( d5 I1 r) |# C- Z, ^ axs[0:2].format(...)#设置第1张和第2张子图
3 H( V& Q9 N7 { axs[0].format(...)#设置第1张子图
+ K3 k* ]' g- U) ~8 N5 C/ y ③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节 6 t% v; a9 U2 c& W8 A- U
④现在Proplot中还包含着basemap,个人不太推荐使用。
6 o1 c% \2 z" V, z) ~
" P3 D# ]" g: L% D8 x# b5 Q
9 O2 Q! X$ t2 b
2 I! h/ V% h6 d" b) j4 P( P4 J9 m4 z4 L2 g
|