气象数据可视化主要依靠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("···") & C! Y3 p6 c/ y8 x& o5 d
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 9 O+ G# [- d X R* t: g R( v V
- / K6 _$ W; Q0 L; o8 p; I, Y3 ~3 u
- 2 T/ }' x/ s: ^ Q
- " k7 _! `# y5 K& h% w/ C
- ) @. x$ O% N1 k/ ~! [5 @3 _' }
* Y5 V* `7 z# X7 S) @+ o- M5 |# Z9 Z
8 |5 D0 v! W0 A9 X! j
( Z B; h4 ^9 j# d* `- % ^6 Y9 N/ G6 f1 }9 D. X2 L, `
- # g* x7 C$ c) K( W+ q& i& x
5 J7 a# }, c8 p
! n ~) _/ ?7 O+ \
/ E; Z) j0 W+ g( ?
* u$ Q1 D/ J& n9 m
P0 I+ ^: k- {+ t
4 Z6 g% E! e) G# v- p D u* T
$ i/ X& ?( d H! T7 F5 n/ k! d! Y- * F* a2 s) {: }: P1 z/ R
- 3 I* l' }( B ]( O2 X
- $ T* x% I7 Z8 `) G6 o' i* f& G
- , R6 f7 H2 E4 Z8 O: o$ U
+ b( L* h2 W$ i8 ]- + |% L/ K( J# `
8 M$ V" }. m: t4 v8 Z- 1 T9 W- g- E c& |) e( l; T
8 s' u2 z g4 b) G' l
#绘制中国区域基本地图轮廓,包含省界#引库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")
, { H9 }/ y. c# V# N
. C6 f+ C; ?, [, _1 e# \! i" s( j& V' W2 `% p
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ |4 Q2 [# J& ?2 g
- - x, W$ A" M. Y# f
: k0 q {8 t" E6 B3 {" h
3 X/ U4 ]5 `4 m' O8 E; L; ^' z5 H* v
# p- G( i8 e, _; O7 t
/ n4 Y/ l8 E, V0 E, {/ z! g) N- " R5 A0 x5 c$ ~4 ]" D
- 9 R( C9 B( i; X% x& h
- % B. g- C) [+ ~2 y6 I
- , o5 V v* A5 \5 x% T6 @
- % D0 j1 P& i; ~0 k# C: m! M0 c
& t8 q4 I1 r: P$ l: R- ( J; X: [: C6 }, f# \, c& ^6 ~5 ^
6 M1 P7 \- h8 w6 h3 p+ M# t( k- 6 K" q5 p- T: N# d9 t) { T
; m2 l" u5 w6 @6 v* p+ h
- t j8 b3 k- |8 w2 H* E
/ u% f5 R! ?8 L
/ W1 ?; Q. D; Y* L6 c, `. T6 p# V8 e- N* m' Z a
#绘制中国地图,并标记各省会城市名#引库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")9 ~$ K. b$ I! G: \! h, S: o
7 I5 v8 C( d. c; m
- |7 R( U* ^% ]& i
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# j+ s; N6 G8 A( C! H& C2 V##绘制有海岸线的中国地图#引库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()
8 Q6 I0 [- b+ z - f0 o. s0 j$ T6 M4 l! d4 I, z
8 A& X" ?* F* J/ c5 \例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, m6 w* r+ |6 H& N- $ \$ Z2 ~( D" C8 ^/ k/ c
- ( E+ [0 Y6 A: J3 ]
$ v$ S# d' h: l' q) q
' |. T' E# F: d9 Q7 h6 P+ G- ! k8 d7 _+ V% F0 y$ X1 N* C9 y
3 b! M) X0 s+ }. j$ i: v3 p1 j
7 B. q& Y: _- M+ A- }7 v/ L- $ q- U8 P! V0 a0 w, u& [. T
- 9 h0 r. g) p+ J" ^/ q) A+ Z, y" f
; _0 p* W4 T" h1 @. `9 G% ^! N- 5 v. g% T, g5 B6 X9 F/ h! J( {
; M2 G# h( ~' H, U- ) E- |: W6 B6 J/ Q) {, |
- ! g% }# z7 p$ J& M' {% A- c# n, a
5 q" s. ~9 ?' s8 f" e
! g( Y* w' Q& S
9 I" r+ x5 \1 V* ]$ a, ~$ z9 X- r& _! f" h. k, p* e) y, Y: x# e
: @8 ^% b" y6 s4 x# u( M2 B0 q5 t
3 G" J' o/ E1 n. `$ W* R0 ^
! `9 T# W' w) ^2 A5 Y8 Q8 s: ]
* l: g5 |" |1 V* t
1 w: |2 C/ m0 d) n) N& |% E- - d6 B. ^' q& h$ D
; `2 P) S" [- o' Y0 G) u6 t/ ]3 [- g4 b$ a% K, t7 o% z+ N' c4 U9 d
6 x) ?( B7 c6 L5 T- P0 z- ' i% B; B6 e$ ]- P6 l+ i
6 U: a, b9 \9 F& i6 x- " C* n+ E! l/ h; c4 f
% Q% g0 u- J! J! t+ a
: M( u5 p! |* d: ]5 T
, B5 G; e5 \# I, }& O7 k
' o% o- C7 v1 m
& I3 j* n' F3 B) b- 2 z: g) J/ k- h5 X4 A% s- _: B
- ' U$ ?! f) q) R
- * |" t3 N$ O+ O8 q" _, G/ p" {
- ' |" k9 c5 d# K; g
- 5 o8 m1 Y7 {9 e" ]/ n7 I7 Y7 Z
. [% R" B3 j. r" ~5 q0 V" p: z" j; q- d$ }" V k. }
#例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))
& z3 B* t- k$ h2 `9 ~8 R8 _
) a, t3 [8 e6 D) L3 z例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) # r: ~5 Z) o* G8 _- U
- ; m2 b0 G) t& W- ~7 c8 r+ v
- ( V5 c' D; q, h$ @
- 7 Z9 b5 \: L& _
" @. J+ ?) O3 Q- k/ {
3 A, m5 K' x% W. Y E7 V0 D
; [4 t3 C% m8 J" T8 G, ?
& Q7 i5 T) g0 T* A4 r- F* o- % h! M; U3 J F+ F$ W- y7 _
- 2 o+ ?7 N+ i8 o( ^
( K; u9 u2 }; A( o" F+ |; y( g$ N
; t5 G: q' ^- e. L
3 C6 X8 }8 v: }) r% N( j- $ F! T/ B" d9 r8 W2 v/ Q) P
- 3 J/ a7 @* z3 B( d/ @& r0 S% Q0 n
- : Y0 m4 J+ C$ p, h
- 8 e' _4 b# O$ \! D0 W8 s
- ; l, v5 n5 Z9 o! o2 G+ n4 u) M$ q/ e
- , v2 O8 D. a& ^. L& W0 ~/ v( j
$ @( }. n" q5 m
" R# m" k4 N2 D9 M; r% M
8 ^8 `/ }+ T, c7 E5 Z8 C2 _+ n- k& P4 d i5 N2 Y3 e
% k+ r' t" ~. R* V- . z! x4 ?& D/ f: g/ ]) S
- * V* M/ m3 y- A
- 9 D/ g, G" E6 |& j. U4 s( s
5 p+ i1 Q( o$ [, d1 R8 E+ [8 R
8 J2 o: Z) v; n9 \, V( A
6 B( H3 h6 e3 U) b+ O$ i/ a- P/ p- + u- J) }0 V2 ], J R, C3 o
* k* L$ Q5 q7 \5 D- S% G
+ a# M' H9 U9 y% A# f5 V4 F- 3 Y0 |+ }! M3 z7 ?1 L* A8 {
, c# _6 o2 _2 V r, Z8 i. i2 `( o- , I1 b- G) L1 z
- - s' u) n9 r: h
" R5 G5 U" |0 G; _% v6 J! ?- 7 _! W1 O- I& W- P$ m
- % Q0 A2 W2 V" f! W
! h B8 X/ ~0 u: ^1 k
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))' D/ w1 P9 w" X( c$ a
1 h0 z4 t0 v7 f0 y. x+ U5 y7 c
颜色表:
( u. T2 ?0 M6 f2 B" y0 H( Y. J$ m% R- Q+ D
|