气象数据可视化主要依靠matplotlib做绘图,其他库包为辅助,包括数据处理的,地理信息处理的等等。 绘图主要有六步(“六部曲”)(不是绝对的方法,视具体情况使用): 引入库包:import matplotlib.pyplot as plt 设定画布:fig=plt.figure() 导入数据:之前已有介绍导入nc文件格式数据(【气候软件】Python读取气象数据 NetCDF文件(***.nc))和导入txt文本格式数据(【气候软件】Python2:读取TXT文本格式的数据)。 线图命令:plt.plot(x,y,lw=,ls=,c=,alpha=) 出图:plt.show() 存图:fig.savefig("···")
. n' m5 ~+ u2 R- j) x
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- - P; L1 C: Y s' R" Q
0 s6 B, g; ]. K( G3 c
1 W- p! S1 C6 I
0 k# k2 K5 H) K) }+ Y( o- 9 H; G/ p9 m. h. ^+ N
- . [7 B3 v6 [$ e' D9 Y# L% b6 d) h
# m; Q- s* X( I( @# r. Y) Z7 ]
4 S9 [; o; E+ U+ |7 s* Y
& |( {7 z& [' W0 P/ c3 ?, _! O- ; K3 x6 z" \( L; R- t0 D
4 p I+ D8 G: T' U
+ Y% K" p: o4 L' S* V( ~ s& \
/ K, F/ w5 z i- _0 j# I% ?- $ ^, u5 j+ p u
7 B' g$ x; a3 I- D, l; N3 h8 K
! |& M- _2 o) J( c) H g
4 ?7 k; P7 F% |- 3 ~- \2 l+ j: H4 }" w
- & W6 D4 v& T2 I9 n
- ) o: P/ @" J; L1 s4 p- p, @
- # O; G/ U+ n5 R) {
4 p6 K3 U( Z$ ~3 X9 _3 p- N0 A- $ J+ s+ D; R! n$ M; U/ v
, m d3 a% G# a
9 r; f& T; Q4 Z3 y0 s0 s1 ]- {( N) k c, D0 Z: l, g2 o
#绘制中国区域基本地图轮廓,包含省界#引库frompyecharts.charts importGeofrompyecharts.render importmake_snapshotfromsnapshot_phantomjs importsnapshot #下载库包snapshot-phantomjs(中间不是下划线,是短横线)# ->Geo 是函数注解,表示该函数返回值为Geo对象defgeo_effectscatter()-> Geo:# 以下为链式调用方法声明对象c = (Geo()# 添加底部地图.add_schema(maptype="china"))returnc# 生成对象c = geo_effectscatter()# 渲染地图c.render()# 生成图片make_snapshot(snapshot, c.render(), "map0.png")
; u( t0 u4 W, W0 W( |
# v! L- h+ q% B/ Y9 a$ y
- b! H, y: r) ?6 S9 V例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 c; m0 w4 \( Z3 N% i4 N- 5 m3 u* X4 ?& X, v/ j. P
7 m( E: D* B! ^0 j+ ~
2 r7 }3 r" R# S# \+ r+ }+ F
5 D+ Q1 d! e& G3 R
6 P8 M" b" Q5 ~0 p
6 z' |7 [$ u9 A) v" Q- 8 N0 |; D% c3 \ j& G3 B* r
- k8 S' G3 y# A! E, j
( X% e5 S! k+ [ g' V2 C
$ g# J( b& q/ a7 n- E+ D
; g) W7 {% E8 r# A5 j0 B1 K e" L
4 A% w1 m2 @. m {0 P2 r3 M
, ^3 u7 J# _* S1 g* j) _6 V% w- I/ o
I1 c' W/ E+ U+ B# d+ |- - W$ F* d+ X/ `. i3 ?
- - e6 u* E; x5 h8 b& H/ w
5 a/ X( k) S; d9 a/ @# b/ F
( a: h8 h, \2 N. t. o) l
) R- D, r" ^8 z& Q) y. N
#绘制中国地图,并标记各省会城市名#引库frompyecharts importoptions asoptsfrompyecharts.charts importMapfrompyecharts.faker importFakerfrompyecharts.render importmake_snapshotfromsnapshot_phantomjs importsnapshotc = (Map().add("中国基本地图", [list(z) forz inzip(Faker.provinces, Faker.values())], "china").set_global_opts(title_opts=opts.TitleOpts(title="Map-中国地图")).render("map_china.html"))# 生成图片make_snapshot(snapshot, c, "map.png")
. p& N' e# g- |! p- c+ F
V4 ~3 }" r: @% }& ~9 \
% p. }1 P! b- {1 k- D, h/ h& p" u例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
" B" b$ w7 M+ j) T- . c! @( M- u9 d& q; h' u0 H% q
- ( \" ^1 j: y4 s. ^* }3 U" X3 f
4 }2 K. k- ~, ?* B' z- |* C
8 J+ U% [9 R& F: f4 |- : u9 r8 N) a* x; @" A
- ( H( X) Q: r, {
- 6 v1 T1 f3 } o! J
! s' M% n$ {* q9 C% K) ^- ) E- }0 q& P" L6 K' q% ^( ~
- , p2 m, |! p$ g) e1 Q
- 3 A! ?$ C' N7 L8 O* X6 a
. K# I* x1 i) {# T1 {
! N `4 p" t7 j$ v! p# d
5 e8 K6 Z; X$ Z
" m4 y0 ~! w5 e0 r* _# o- j7 P$ j
, ~: k8 s( J( O/ _5 x- % D( c' c8 K: h3 E8 Z' p6 {+ T
- ; j5 U1 D; w* R5 R9 N
0 ^/ V$ r( E( h- 8 K8 J8 O7 @- b9 v5 V
) ], |: P$ M+ `2 n4 E# o
S* m8 R, N! r3 W5 c% a* m, {: \
; X6 `* r' F- R9 l3 R- " z4 v$ b5 L0 e' H0 X: z
) ^& A4 M6 S$ h9 |, f- 8 ]8 A/ |' _8 O9 [, R
% ~1 K/ G" I/ r" r+ S& d- 2 X1 @+ k0 B; q i1 H
0 ]2 X+ y& H3 ^ L3 [3 H6 s
6 [% ?- ?' O/ D* w- 3 m/ {" G! f e: y/ G
G' I; t% O' s
% F9 t- e" { @/ u L) d8 T- 5 }. p9 H5 n. Y: v, k" ]
% s+ I, x; P4 B! F" t5 K: X- P- h/ W+ c6 }/ ]; j
- 0 l) }" d( L4 n2 p
- {9 |6 B" h/ R+ K3 N
- , q, R# J9 \* t6 Q; O2 n
' T6 W$ M. ~3 A9 w7 W- ( z4 N* ?+ k( `+ f$ j
- # D7 ~' G8 ~9 F4 Z! z; o
- % Q( V' J/ @$ f# \
" Q2 j/ @3 y% J! c+ ~+ t
' A( l9 c4 t" K! m
4 U, O. O' L- g- 8 k4 _7 `. J6 E4 {, D& M9 L( Z
$ ?. Q! E3 S7 F# p
) l/ j$ N3 y/ B9 E( G {3 G: B2 X! J$ ?! Q' J- % w6 ?% p+ K) J3 p$ v8 Q) o4 x5 V
- 1 s' |4 z6 x2 R. W% P" J
; [* E+ p/ ?6 B
##绘制有海岸线的中国地图#引库importpandas aspdimportnumpy asnpimportcartopy.crs asccrsimportcartopy.feature ascfeaturefromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTERimportcartopy.mpl.ticker asctickerimportcartopy.io.shapereader asshpreaderimportmatplotlib.pyplot asplt#数据data = pd.read_csv("meteo.txt", skiprows=1, sep='\s+', header=None, names=['station','lon','lat','tem', 'pre', 'sun']) print(data)#建立画布fig2 = plt.figure(figsize = (15,15))proj = ccrs.PlateCarree(central_longitude = 115) #设置一个圆柱投影坐标,中心经度115°Eleftlon, rightlon, lowerlat, upperlat = (70,140,15,55)#建立子区域#ax1 = fig.add_axes([left, bottom, width, height])f2_ax1 = fig2.add_axes([0.2, 0.2, 0.6, 0.6], projection = proj)#在画布的绝对坐标建立子图f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())#海岸线,50m精度f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))#以下6条语句是定义地理坐标标签格式f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())lon_formatter = cticker.LongitudeFormatter()lat_formatter = cticker.LatitudeFormatter()f2_ax1.xaxis.set_major_formatter(lon_formatter)f2_ax1.yaxis.set_major_formatter(lat_formatter)f2_ax1.set_title('Chinamap_coastline', loc='center', fontsize =15) #图标题名#读取shp文件china = shpreader.Reader('cn_province.shp').geometries()#绘制中国国界省界九段线等等f2_ax1.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)#添加南海,实际上就是新建一个子图覆盖在之前子图的右下角f2_ax2 = fig2.add_axes([0.8-0.6/7+0.01, 0.25, 0.08, 0.13], projection = proj)f2_ax2.set_extent([105, 125, 0, 25], crs=ccrs.PlateCarree())f2_ax2.add_feature(cfeature.COASTLINE.with_scale('50m'))china = shpreader.Reader('cn_province.shp').geometries()f2_ax2.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black',zorder = 1)#出图plt.show()
]: L* \! i7 R! G , ?$ Y: j# b& @7 b- [" y
( N8 h0 h: U. G+ O# X例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 L: c3 g7 M+ b9 w- q% @
- 3 r. P1 b3 |: G }4 Z+ s; ^
3 f* K" u' U( H2 r) }
. U$ n t9 K4 Y6 n$ O7 e, D- " \ j5 }* {0 ^
- , S; ?1 r3 {* x. B) V# c& ~. ^
- Z! i) Y R6 s0 j- h4 H6 P
; b' U) X5 L' Y' E- " K+ |: \* _9 e( ~9 g# G
/ \) [% l3 P+ r9 I( {2 {# K3 j- " _9 f. x3 M4 ^
- 7 F' W' t5 D1 I' M
- & ~8 G. u2 K" U6 r
- / s& [; N- t; G" d3 v+ S# P$ `( u
5 D. \9 y, r- g. v& X% a
4 W: x1 j$ |1 f! h! y( }/ Q' n3 ?- 1 K( n, K9 ?. S$ c+ P
- 8 X/ D b+ f# J' y# K& f) f# q) D
- ' s) ?( w6 u. L; l
2 F5 ]. a. L% m6 q' g3 @
7 h, ~; o) ^/ ]$ X% v
& W" a6 f& _( v: O. u4 P
* I2 B9 y6 T- N ~7 a. [+ ~
3 d4 j F) ~! W7 R6 [7 ~9 U4 c- 9 G. P) ~3 ]& E. E
. k* f- C& P# U4 ?) w' q# i6 h h" V9 i6 l
1 t8 S4 d3 x0 k5 p* {
% A/ N4 K9 D& m. a( g) \- 7 n: j2 a) d. ]' z7 R7 k- h
) y! }$ E. p2 ~- r
$ a8 d8 {2 w9 @& a& F+ ]- Y0 N |- 0 x2 W" ?$ P, a9 \& `: q
+ X2 u% f, J8 ]
1 E5 Y. h' ~ K% p7 }1 s- ! M7 V& i$ N" p( s l8 ?
6 g" _1 m7 s- q! t5 l6 n( U9 G1 Z
! R8 T6 I- |1 o' T* J& a- # }( z/ @" \/ Q
- 9 z; T- r* v. h' s2 r
- 1 n/ D; h7 p5 h% @9 Z
$ C4 [9 e8 H0 W, _4 q. s* K2 W- + v$ P7 u0 U# Q: a
7 ~6 _9 R* E9 u8 Y
#例1:绘制粗糙的全球世界图#引库importnumpy asnpimportmatplotlib.pyplot aspltimportcartopy.crs asccrsimportcartopy.feature ascfeature #添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER ##添加经纬度所用importmatplotlib.ticker asmticker ##添加经纬度所用#中文及负号处理 plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False# 解决保存图像是负号'-'显示为方块的问题#画布fig = plt.figure(figsize=(4, 4), dpi=200)#子图proj = ccrs.PlateCarree() #默认制图时,中心经线一般为本初子午线ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) #一行一列子区域#默认海岸线ax.coastlines()#添加其他地理信息特征ax.add_feature(cfeature.LAND, color='limegreen') ####添加陆地######ax.add_feature(cfeature.COASTLINE,lw=0.1) #####添加海岸线#########ax.add_feature(cfeature.RIVERS,lw=0.25) #####添加河流######ax.add_feature(cfeature.LAKES) ######添加湖泊#####ax.add_feature(cfeature.OCEAN, color='skyblue') ######添加海洋########ax.set_title('worldmap', loc='center', fontsize =15) #图标题名extent=[-180,180,-90,90]##经纬度范围gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.2, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False##关闭上侧坐标显示gl.ylabels_right = False##关闭右侧坐标显示gl.xformatter = LONGITUDE_FORMATTER ##坐标刻度转换为经纬度样式gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1], 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3], 30))#更改刻度字体大小gl.xlabel_style={'size':3.5}gl.ylabel_style={'size':3.5}gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+10, 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+10, 30))7 H/ \) E9 f5 |7 k( X3 F/ e6 ~2 D
% u5 }8 A/ D; u) r+ _, n3 d+ u例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) : ?8 Q6 `2 l7 k) f
- ' N5 ]0 t) m& y* |* l( w* K; p' a
% D+ P) U; z* Z- z; ~- . y( l( K! l+ P
- 4 E' O% n5 N. b( I! p+ x ?
- 0 Z7 Q- B# L- @2 V
- ' E4 k, m9 J- _) `, i7 y b
y% M* G/ R$ b% Q) s) v4 b/ \
7 \) a1 u" [- U& J1 J, v5 L1 |2 w
- T7 l% _4 d+ d% Y; M( E8 {- n
7 e1 E; o% T6 }" `4 H- K5 s9 ]; [
8 E* l4 @% Z( u$ k
8 W4 ~0 S: i/ m8 B$ |- 3 w% t0 L0 W. C( ?
- + {) m3 I: s0 K
5 k. I+ ?# J9 u- 0 c' ]" u/ C9 y/ U2 B4 }6 i4 f
- 7 s! R* t# k' Y8 a$ w
- 6 _5 T+ K8 O( M0 g/ |
- 0 u/ H$ I7 M+ x `% `4 O( I: ~+ W
8 |; a) s% `9 o- / k7 [: B- k% j* ^! f
- " M8 ]$ k/ U% K% r/ H' c
C' l5 ]4 P) Z7 W3 m% U0 i$ `# Y
$ @. ?8 G9 E! M/ x- 5 y' i* Q p- D/ Y4 R* Y
- 1 \; `1 F8 q% l- g' R8 w
4 O0 z. N1 ]* N6 r6 U/ Z- " C! C) k, Y. M& e+ _. }* N
- . s4 Y. k ?$ q- I* Z7 Q
- $ b3 Z; ?& P" I4 e. P* Q: B- d
- / M$ o0 R7 M: l$ n9 s! R
- 6 a2 u+ ]5 N% j& T+ w
8 [9 L4 { `; v) X8 x: K- ( f6 D) ]' \; U" C7 Z
6 n/ h8 L* B" ] Q
. q2 q( Q/ e" M+ w1 T) h0 N, L* s- $ T, H, l. Z) m) z" d0 E! p5 C
m' Y6 d$ f, V- ( ]8 Q- D5 t- r! {. F( m* A9 e
[9 F$ Z |( [0 L x/ |
importnumpy asnpimportmatplotlib.pyplot aspltimportcartopy.crs asccrsimportcartopy.feature ascfeature #添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER ##添加经纬度所用importmatplotlib.ticker asmticker ##添加经纬度所用#中文及负号处理 plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = False# 解决保存图像是负号'-'显示为方块的问题#画布fig = plt.figure(figsize=(4, 4), dpi=200)#子图proj = ccrs.PlateCarree(central_longitude=130) #中心经线为中国ax = fig.subplots(1, 1, subplot_kw={'projection': proj}) #一行一列子区域#默认海岸线ax.coastlines()#添加其他地理信息特征ax.add_feature(cfeature.LAND, color='limegreen') ####添加陆地######ax.add_feature(cfeature.COASTLINE,lw=0.1) #####添加海岸线#########ax.add_feature(cfeature.RIVERS,lw=0.25) #####添加河流######ax.add_feature(cfeature.LAKES) ######添加湖泊#####ax.add_feature(cfeature.OCEAN, color='skyblue') ######添加海洋########ax.set_title('worldmap', loc='center', fontsize =15) #图标题名extent=[-180,180,-90,90]##经纬度范围gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=0.2, color='k', alpha=0.5, linestyle='--')gl.xlabels_top = False##关闭上侧坐标显示gl.ylabels_right = False##关闭右侧坐标显示gl.xformatter = LONGITUDE_FORMATTER ##坐标刻度转换为经纬度样式gl.yformatter = LATITUDE_FORMATTER gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1], 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3], 30))#更改刻度字体大小gl.xlabel_style={'size':3.5}gl.ylabel_style={'size':3.5}gl.xlocator = mticker.FixedLocator(np.arange(extent[0], extent[1]+10, 30))gl.ylocator = mticker.FixedLocator(np.arange(extent[2], extent[3]+10, 30))% ?- |) {4 r% s( m6 Z7 ~
: s+ N' |: y4 O6 Q" [6 Q7 t0 S% E, Y9 a( M0 {3 @8 c* g( J: ~
颜色表:
9 W. D8 o1 Q$ _
- \2 H" B" n; [ |