|
5 B! ~( o, Z- \! o
Notes:请务必将matplotlib的版本控制在3.2(或以下),经过测试发现,3.3及以后的版本在配合proplot使用时,在设置colorbar的时候会出现警告信息,同时生成的图不正常。降版本之后问题不再出现。 7 n s. d1 L( I
在我的上一篇文章中,我推荐了由NCAR负责开发的PyNgl库作为Python语言下面的地理绘图库,并且介绍了如何在子系统(WSL)下面的安装方法。详细的请见传送门: 7 H4 y- c7 s( Q! H6 k0 Q2 `* H/ b( f
9 p o. O* l6 }" Y 不过现在选择使用PyNgl有些尴尬,首先是官方宣布不再进行大更新了,只进行小修小补(维护模式),其次根据一些说法,PyNgl相较于NCL本身,还存在一些Bugs。总的来说就是体验一般。不过,如果很早就习惯了NCL的声明式绘图,可能你会非常喜欢他。 - r0 [$ M7 S- h( ~0 `* i% J
一次偶然,我发现了Proplot这个库,Proplot对matplotlib进行了高度的封装,是一个高级绘图工具,其功能相当强大!而且融和了cartopy、basemap、xarray和pandas。作者是来自科罗拉多州立大学大气科学学院的硕士研究生Luke Davis。简单来说:Proplot针对matplotlib和cartopy的很多不友好的方面,并通过封装来解决这些问题。使用者可以通过新引入的format方法来完成繁琐复杂的图形设置问题(更简单的代码,更好看的图形)
4 K4 S6 c' k$ B+ s: C% s ; Y3 T, f) ~' V0 w* h
在官方文档中,已经大量的绘图例子,可以前往查看,下面简单展示一下具体的绘图效果:
4 p. z2 g5 k8 R ]: b ①简单常用的填色图:
4 |9 \! A" r% `' c+ s7 N& e! A import proplot as plot* I/ S' ^$ b k7 s( g
import numpy as np+ I( |8 f5 n# T# |% |; n9 s N
# G9 q3 L! m* t
# 创建虚拟数据0 |/ Y* {1 s' ?: T
offset = -40/ b$ H$ X: k9 B, ~! e8 L+ B) |
lon = plot.arange(offset, 360 + offset - 1, 60)
2 C9 b7 a& x+ Z+ ^3 R8 ^ lat = plot.arange(-60, 60 + 1, 30)
0 X& \8 q; R( S+ w7 g# U- b2 | state = np.random.RandomState(51423)- S5 g7 i3 X$ [9 b( g5 j# i
data = state.rand(len(lat), len(lon))
6 Q$ \5 @2 ~) E
+ I ^3 t- u7 W& ? plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
4 b+ C% B) m/ c1 F" Q) x proj = plot.Proj(cyl)$ p, ]1 Y; y0 Z9 ?
fig, axs = plot.subplots(nrows=1, ncols=2, axwidth=6, proj=proj): q p; `9 B7 D" _9 W) C" m
axs.format(
: R* N" W: A/ n1 |- f: d1 q$ [/ M/ i abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,
v, L- b" J0 n4 w, @) K labels=True, lonlines=30, latlines=20,
7 B5 D1 z: x: t coast=True,gridminor=True,coastlinewidth=1,+ X5 z9 B8 m/ m- z: w* {8 p4 p; ?) t
suptitle=Contourf,suptitlesize=20,* b4 F J# W0 ]! V6 ~( V6 C
rowlabels=[Cartopy example],
' e0 X. }5 J/ D+ p collabels=[Contourf, Pcolormesh])9 [2 B) G+ V# ~/ Y8 r; N& P* `
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度/ l7 r' |9 [. _9 D0 ~* g4 D' \
8 k! f1 G* W9 v" `4 H2 ~
m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)9 V8 {7 f2 m; ~" W# [3 v3 u* i
axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)( h* y) n- W8 y. o9 f* [' u
3 a2 T+ I# \2 t) b) @ J
fig.colorbar(m, loc=b, label=State,
% m$ X4 Y3 U# o; @% V9 c labelsize=20,ticklabelsize=18, extendsize=1.7em). Q( c* n. |& ]& G7 F& `: v1 p
fig.save(rC:\Users\59799\Desktop\image.png,2 F- @0 r6 n# t: H8 a" ~
dpi=600)/ ~( t( Y8 X0 n
plot.close()0 `8 a) y* ^! z2 E% _2 ]/ R
w' y. p% x4 z) H1 r
t5 h! i& |/ T) D ②子图特殊布局: $ g2 ^3 U! Z- A& w
import proplot as plot
- }/ l/ P6 b \2 ?7 C; h# ~- Q3 K- u3 }* p import numpy as np
: X) Q' [8 h( B9 y' E# p M. K) O7 ]/ u6 j
# 创建虚拟数据: y7 j& i3 M$ f8 g l' D( W1 ^
offset = -404 r( q' d: P8 l
lon = plot.arange(offset, 360 + offset - 1, 60)
' T4 t* E) Z# V! G& D* E: o lat = plot.arange(-60, 60 + 1, 30)
) T. n$ Q: K5 y; z, L6 F3 K state = np.random.RandomState(51423)$ w I5 d+ X$ q7 U. r( a
data = state.rand(len(lat), len(lon))
( S% W3 S8 z% F4 b; B* l1 o. R+ v3 U+ L! s3 q
$ Q4 B7 U; `" }0 s( b
subplot_array = [[0,1,1,0],9 A5 |& ~2 ?( s' c) u
[2,2,3,3]] #0表示没有图片 1 2 3...表示子图1 2 3...
4 Z7 l: _0 b$ p" n8 C/ w2 u+ l C+ @) { y- q. p
plot.rc.reso = lo#海岸线可以不同分辨率 hi med lo x-hi xx-hi
0 H) w9 E" z0 Q' @. ^ proj = plot.Proj(cyl); W' n: D' ~3 X7 F# I$ H% y
fig, axs = plot.subplots(subplot_array, axwidth=6, proj=proj) e' D. b$ j3 ], ?9 m' V: _6 }
axs.format(
s% ^$ ?9 i/ x# f0 j) q abc=True,abcloc=ul,abcsize=30, abcstyle=a), gridlabelsize=18,- H) Z9 |2 h7 T( c
labels=True, lonlines=30, latlines=20,
- }. I/ c4 T: m/ j1 g3 {1 ~* M' d, U coast=True,gridminor=True,coastlinewidth=1)! @! ]. J U% V; _( g+ u
cmap=plot.Colormap(Div, gamma=0.6)#gamma提高颜色深度) A) i X# x$ z3 g; E; z
# l0 L! t* T& z9 j m = axs[0].contourf(lon, lat, data, cmap=cmap, extend=both)
+ K) c# g: D, o1 {8 x/ g axs[0].format(title = subplot 1, titlesize=20)7 o1 j- I6 A5 v5 r8 R s' O' X8 @7 M
- ?2 r, `% Q" ]' o: a( ]/ y axs[1].pcolor(lon, lat, data, cmap=cmap, extend=both)( {$ o5 Z8 G: O) \
axs[1].format(title = subplot 2, titlesize=20)
4 ^; \3 s) O1 K8 q1 _3 g2 j9 I. O2 l( X" V. f- N6 y
axs[2].contour(lon, lat, data, extend=both): |1 Q. C, k2 G* Z) D& M- A% ?
axs[2].format(title = subplot 2, titlesize=20)9 F1 h1 r+ C: b8 ]" |# @, {
6 U4 i% } G: H2 l fig.colorbar(m, loc=b, label=State,
6 |. Y; d( f4 W2 @' B labelsize=20,ticklabelsize=18, extendsize=1.7em) ~ o/ r$ o0 }5 E- h9 _( z
fig.save(rC:\Users\59799\Desktop\image.png,. @4 H h3 d2 `8 x' V. O7 X
dpi=600); @9 n" Q+ q, h& L7 d% k5 S" t/ T
plot.close()
* P0 l6 f/ g0 y6 A' q) {
: b7 [3 B# d. g+ @$ o 使用技巧: 7 {) ?1 B/ [9 \$ A) |, F% K
①在保存图片时,默认保存的图片为1200dpi,如果直接放进word文档,可能会因为图片压缩导致图片异常(如果设置为不压缩,图片一多会导致word非常卡),所以请尽量使用dpi参数改变保存图片时候的dpi。
/ D6 w6 R: N$ {( j' I0 k% g ②format方法可以针对不同的子图设置不同格式,例如: ! M) z, N6 S: H* W$ Q7 ^; ?8 V: f
axs.format(...)#设置全部子图
# n9 r/ C* Z* V1 ?+ q) _3 @ axs[0:2].format(...)#设置第1张和第2张子图
$ G# v+ h$ m4 P9 Z% M4 I& l8 Y axs[0].format(...)#设置第1张子图
) f0 S0 Z- h7 @# G' r; c0 l, P* i/ U ③所有的图形设置都可以在format方法中通过参数的方法完成,具体的参数请查阅官方文档的Configuring ProPlot章节
( I% E) J2 W* r! t6 p ④现在Proplot中还包含着basemap,个人不太推荐使用。
" D/ p7 l6 R1 q/ I; C4 }0 H0 e$ ~% Y! M1 y: k/ [
# ^- ]: Y0 H9 e
: |- t! V2 i) S& C# ~! R: H- G/ J
7 L) O( P* ? r; U: C: h |