|
气象数据可视化主要依靠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("···")
, O$ T7 W# D* O# W. h6 J0 @
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ C j) n3 P J' u& f8 i. C- & d8 m ?3 k2 z8 ]
! h. k+ }$ H+ G8 t, X- ) G- A% K/ n* _% _
' p" ?! \$ l$ m# q& r
7 f3 Y4 [2 u5 {6 k. a. g& W! [
% n4 C9 O& q/ @8 k. U
( ]1 [9 h% L9 f+ E! k
4 H0 m; k+ e7 {7 O0 Q0 l- 6 u1 q0 L- c2 }
- ( a" \- g/ p0 u D. @5 c: y7 q
3 N$ a0 ]: }- r- 6 K$ f3 e8 o& A4 ]$ ^2 M
* ^( k9 |1 t( X, |$ { Z: {8 N- / u+ C8 O" x2 M
- + P9 C3 U! ~8 v6 p3 N
- 7 o( _& K4 v3 f; n \. I3 N
- $ s/ W& U7 V9 n' c
- , L' v/ w. B: L/ z
C) U0 Q# E A5 Y& B8 _- q3 O/ {% e- T C
5 f8 |5 {4 c5 T* R$ g( f- 7 E! W7 d2 d# m, r
8 L% k1 m$ r0 @* r3 s
# f! a9 ]& Q9 |$ P, A/ s8 |( p; q( e2 u4 v9 ?% r! ]
#绘制中国区域基本地图轮廓,包含省界#引库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")
, n* p, A2 P( D3 Q, `/ c 8 g; D3 A. N4 X/ ^: O+ A6 T$ z+ ]# s
/ R2 D. i- C! p例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) ^& m0 w$ ^8 j' e* b
, _+ T& b' X" H6 [1 ?3 b- % U2 I' v$ {& a0 L+ s& y3 g0 a
- y* u2 P0 K% ]( c8 j, J, ?
3 A& C1 W; d& R1 f5 m
& Y) s5 T& l/ X, E+ |- ( e3 o( J. q/ h6 {1 T; p
+ [0 h% U V; m% b; p2 A
, x' m% K* b8 U) z: S; m: R$ B
* y% K7 Q- I) u: Y' o- ; G" R8 i% z; t; c% f! l
- D/ W: k' u! m
- W4 O3 Y4 \: p/ O, X
* R N" \) H- \3 V- & y( A) c; V. S1 R6 {
1 n2 R- ?! f& Z( w3 \& ]0 X. v
* Z+ H) o* M! `, {- & P) h* W+ y+ o- R. e
- . g* w& s8 T- R; R; b
, _1 e8 l8 A3 `
#绘制中国地图,并标记各省会城市名#引库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")7 J& O+ C, e6 I3 a2 n* Y& D
$ X- d) V9 D4 z; A
* L; e9 ?; i' l: W1 }& e( i
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 P9 m; y* x; O' R
b, l+ P9 }% a' a* V. O F1 k9 ]) q- \- , _# n6 j- W# H& t+ I0 |( C3 x% e
* m# U; s3 d& c, f- ~, v6 z: @
3 P# G, E4 ^: Y; e0 r
: Y; s5 [4 U9 y# V
a8 |, f3 w$ T R- 0 P9 S, H# |, D, ]# M+ p7 D
- 3 e @3 X; w% q# G. H. g
7 F. Q2 I% _3 H; u) }4 I3 Z
. D9 \1 X" F4 M; P f' L5 c: f- / c4 T" u9 T$ P
- 0 C0 ]; `( o6 \: w
- 7 {1 i& w; v. @1 C
- 4 a/ r+ L. N: h! \ m0 |5 g
4 }* s H% S4 o- n8 e' x6 Y, d- # U! t$ m5 g7 L w, L
/ T. ?* f3 t' z7 N0 C( K
( l* P: |( O! N ?+ }
1 m5 u: f. l3 C" X# i0 K. Y
9 E ~* b& I3 Q' I& z
4 F; E8 |3 Q t. i, ^& Z- 9 P V$ b2 W. `
+ z: e7 C) H+ x/ \9 |8 k- % v0 z3 C1 w. U6 [
- 5 t- a0 D0 {: d5 p% ]
& P! M! z8 L3 m: o5 N1 @& @- 3 d- R; I0 W0 {8 v# E R% T
- ( m) ^9 V. e \7 w q
0 E* j- p) c' I: e- % [7 Z! B: q" u3 D
& f' I3 Q2 [0 @- [0 K/ @- ' E9 O+ Q5 r2 E: }0 k& ]! D
8 A# v+ F/ S9 b" ^- ' b" o% a1 M0 V8 h$ R7 _) W
- 0 E) j# |$ b3 ~& r
- x# B5 z0 ]! } [$ ~- G
, ~7 D; ?' @6 R( k, s. Q. ~
2 \" H0 e( A: R ^8 K4 S! A M; P- 5 f- b% X5 ]* S( E' t2 Y" `
- - y; y' ^. \0 d3 q6 S% V. I. i
8 A: @# X. F& ]9 t7 j. T
! N1 _) H% ~. i3 X* \/ d. }- b$ o
1 u/ g0 q) f7 j0 N1 X
* E4 y" l \0 t0 j8 W9 ~1 L# i: c! m- j: t) f3 i+ \ B
$ r3 y- }+ a& }
. c$ G7 F$ H2 X7 V& w! X t* Z5 \) Y
( @8 f' f' e/ u. q* K9 @
, s M* i8 i, I/ E- " c" `. K5 o2 }$ F5 e5 ]5 B( b
5 Q& n+ N: G, t$ d$ }8 j$ k* }" z
Z& `9 o4 V. r" A( K
##绘制有海岸线的中国地图#引库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()$ @) q2 S; I S( {
" U" i5 C& ?/ ^0 B8 T$ J2 ~6 q _! Q% V7 a
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 h M4 J8 L; @6 r/ O
5 ?7 @9 ^" N7 O/ g0 G
2 v: t8 S) H; D0 l8 ^; `6 ]
: ?6 U* s2 @8 _) r- 8 ]9 h! g4 g3 b1 r0 [
5 s, x3 F# s$ D- ( P) u: r: k2 b) @" M
, N" G) c& W" f. }+ \
+ |' y- i F- I0 g0 B9 z- Q5 I1 z0 Y; F; f
- & T8 c1 |! ~* b! q0 {* R
- $ Y8 z o7 _' V) s* `' ?" ]
- & d- }7 _& u/ C a' k0 p. m
- 0 \! d$ ^& |1 ]) J P1 X5 Q
# n' ?0 I# ~4 R8 e; b- 7 y- p8 x! Y, T9 L
0 G& Z; }$ r/ V- q4 s6 Z
( I$ f" v6 P* h9 [ c1 y" z9 b- - |6 T# [* K Q( L2 i+ |
" W" W$ g8 I' Q" j
; _: @/ }+ K4 g( B" a P- * n- P4 f; T& K% l- ~
- ; G2 H$ o* Q' F% i' t- [
7 V3 b5 B2 l4 h, M2 b
5 s( a! G2 d2 ?! Z1 q$ f- 3 l# B# T% H+ R- R1 R# n9 s
- ( f) {. n$ C" b* V
- ' A! a$ a. E& ?
6 I0 t5 ?1 D3 i) T
- \) E. J. D% Z" c$ ]+ x
9 R1 a4 u! ~1 A" N0 o- ( L, e" f0 C% u0 q$ l: W
! f0 ~0 g& h4 `/ K- / o" p1 F( Q8 Y
- % S$ d1 K% J9 E# M5 V
& h4 G! ]7 Y1 R$ Q9 u% R9 p
p- f# J' M: [ p- v- ' g2 Z. ]- n# m
- 2 ?* A0 K f- ]/ k4 j3 E
# u7 I; W9 a. f$ G9 L
% ?& F% O; Z8 z- + C z& m+ W1 J) R0 Z$ p; ?
/ A7 Q3 P% n! m2 w
#例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))- H- i4 |. M0 T! F4 p) J' x
4 ^: `2 _- r& _9 |例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) : q; B% O' e. d& S, G
- / s7 H; p5 S% f* x4 _3 f
# e* x& r2 O3 u' ^8 Q
4 a- w# `$ V+ ]1 K: M- Z- : g) o- b- u! I% n
- % D( T% ~- a! D) }; c- d
- $ V9 y; x3 d/ B7 U
- : U8 {/ N/ ^7 D! R0 F$ Z
: Z* @! A, G$ E; f( d2 a- - H6 k2 }) j% H
- ' t( |9 Z$ X# d
) O7 _- e. o% \* t4 m+ B( B2 D
& ~6 a2 Q6 e: ~( e, z
" t& V/ E7 `0 J" _; \! Q- F
9 q6 h0 u4 [ e- t+ m- / q- T" |, h7 C, P
- ; s, U' o1 i; p1 K$ [
- 4 }! e! G' y+ f8 E
- + k& i, r+ D( r W
5 i3 x& d" m; }4 l( n& D- : S* V" Q; X2 G" K2 ?
- & t6 v" T+ T& N3 _* W- \7 `- J" O
g( [5 E) [4 t. p' `& m- 3 W1 R7 A# M5 z5 V+ l! d6 |3 i
- 6 R" d& Z5 c: P7 M7 ~+ E
- # A! L; v! |7 ]+ I4 D
* u8 S7 z% A+ F6 Q$ L- # H+ i' c( [8 z5 ~6 g
- % }1 o/ h) }# ?6 }, k7 J
& M* |/ Q5 R2 c& @
5 ?% T4 L+ n5 M n, D; V3 R* Z
; r8 O3 ]* Q9 z- i- 8 t: k. O! R% V8 G) E% g. g
$ Y4 q! v8 I0 O" F N+ `$ k% L
4 t( M7 S$ g( Y1 a3 |9 w- 2 |' C) L9 l3 `5 W4 _! k; J% t
" o) j# d) p Z' ^
( C2 f9 X( q/ V( N# T5 R( f- 5 y; M0 Z B2 u5 i/ O
& `4 H% J" {1 B) q; G- E h. L7 V& g& {3 F* k. E
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))- ^. r# a$ E+ X* \. q3 V+ y
" K" }* k R/ F3 v% B' ?' {
2 z9 ^8 Z; d# L& D+ ?9 v
颜色表:
' e0 V& h& `) ^: n' `: n5 }3 H* U. ]7 I) y. u' ~! p
|