|
气象数据可视化主要依靠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("···") 8 M! y! i" f3 B! D
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- % C3 j# @' [ G8 y! H6 ~
- ' c7 D6 x. b+ D: E) I
8 U1 ]5 |) D6 V V7 k/ \
- B" t9 k( I" M) U* a5 I/ m- 3 x5 v" f& y' T# L& A4 l
- 4 ^7 ?8 G, z. I/ k0 c( H9 I
- Z, Z3 ^6 Z* _$ E. _* s
9 f1 z$ F+ Y9 X0 U$ `# V- S- R; M9 W6 L% {& e. F: B
- 7 W$ {! \& g, V8 r
3 [. R2 i+ l( N* F# O3 s$ r5 x- " o, c, [8 y* F, T: `3 F9 C
/ O0 B* V) W2 h' n* B
, E5 T/ i0 S* x# U
: B4 g; d# T3 ^
3 G& V% u3 ?2 T) b
: y+ S& C4 }+ H
8 ?+ |- E# a1 l* j7 \. ^- ' D* u3 c$ U2 _ H8 M+ x6 p1 T& R5 X
# k9 d' v# n( B# F- 0 P7 H7 Z" m. A
- 5 ~5 |- d2 V+ v/ S9 F; x7 _
0 @& g" c6 d# r) i' R. t
5 Y' {/ B5 L* p5 H" l
, {$ b* Y4 i1 B) z# J" e5 e6 W0 { n* v
#绘制中国区域基本地图轮廓,包含省界#引库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") v. j7 I* r% k2 D, L
2 N( O. g, |7 f: @. w4 e& |0 T( ~
* V9 ^) Q# j+ F k例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ I c5 y1 c1 z. S6 @6 D3 S. g
( y% g% m' ~& y$ O# ^9 U: C* F- " r+ b6 [, S, X: @
- ) V8 @* u/ a( T& @$ m
- / F; x/ R" K: W
- ) U! w7 m: k+ G( R& ^4 O4 T$ h" U
- ) j% L& S6 U( e# `" F% _
/ [, r$ V0 p! ]; s" e- A3 u+ ]- 7 b6 o* w/ E+ k* K7 v3 v" c
9 X8 n& {# I) u) I/ [
# U* _$ N4 B$ j* H- ( ^: |9 _$ y8 q6 N5 @
: ?/ ]8 l( G0 `5 A- b
2 K- V4 l# [- i. ~6 v `4 f: @
: ~, P9 Y) G6 n/ D3 r- \8 V
; ?3 H3 I8 T: F
7 j' C+ u, l' y5 K
% K8 S; U9 a3 B! Y- 0 v5 \6 x2 T- }; Z2 ?
3 _3 R8 `( |7 b' `. f* Y }
#绘制中国地图,并标记各省会城市名#引库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")
* D0 b9 `8 j& @ " U$ Q( {( X% R9 v- K$ y
+ P3 ], W' D9 L3 J例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
. W# B! k( m& C& m0 h( n/ i
##绘制有海岸线的中国地图#引库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()1 J3 h7 e4 H l5 E6 {
% H0 k- j% D" Z
/ {2 T1 R% }2 n8 i
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
7 A% ]) R0 d) v
) {& `0 f6 |: O( j/ V1 A' H- 0 L! k Y5 l1 G9 T
e) b0 ^: A+ S' y2 @& v- ) |2 m, S7 M& o. L1 F
+ \ B- ?6 y* j4 v3 }7 W- 4 J* ~: R, a6 n; v" W1 g- v) h
- + t, R0 o3 B% X: [" [! @1 A
- 8 M$ R6 p, z% P# F+ A5 @
3 U2 Y5 s7 R/ T
. ^5 v8 y3 y/ | L8 e
4 ^5 S# t$ j, d! g9 J! ^2 s- T @
- C& C- d2 z0 C: N* \- F$ l2 K
1 @# Y( k) e3 `1 e, @# I
4 x+ J8 l p- s) B9 m8 Q- / E T$ H; R, C$ m0 e* Y
1 j& I O. I6 k' y, c- , I9 V0 E% e0 R% s0 d+ x
8 L# T- _, |6 w" t' n
" e$ x& h6 c8 |2 ^+ F* Y' k- 1 R7 K8 }- K' @5 f% ^% [- Q
- ( d) p; n3 o; D, |+ t
- p, p8 }( D: q! ]- : V) v- n8 Y# X% S1 }! r3 a
- ) v' g7 y: |& N# M- @& j( T
: `+ y) J$ E' E" Y& t- ( Z- i, _9 R T& n( z7 K
) y$ j# N/ m$ u) x- x/ Z- & o. h" j% z$ q' F0 `) a- Z0 Q
1 G6 |! s9 X# H$ r A- 9 [# D( N* b. Y, n9 ~! _) c b+ f
; C( y' O8 w. R0 q- . j% T3 N$ D. `' C5 _5 _; ]& n( ?
- ( V/ \- q. S) u& f. ^ W
9 ?: w* ~! ~ g& O7 I, B1 x- 7 w; t5 r' k. F4 }! ~
" A$ C4 T0 c4 Y5 Y5 e. Q. m
" L0 N* C4 ~- n% i; M- + p! I! N" G0 r1 n- g* M$ c8 D, V
2 Y3 m9 l2 v' f- v0 H; p9 m
0 e, ]2 m8 K X) o. i
8 ~8 w% l/ x0 U; W. t$ {0 U5 J( }5 b4 s3 ?2 k1 X3 ^
#例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))
. s" M$ R! t, I3 f6 [; F' W. k. L! w 1 Z: G# u" ?: c
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
$ Q! K' J) u$ _9 H g
8 o3 V+ q3 O8 w3 ^3 \
k8 q( `# j3 \5 N$ @/ E* t2 g
( B- R- g1 S3 \; R* f8 F
, z. m$ l* m- @- v m- 3 F' Z7 O- R+ K& b1 y, l o
8 a" i c2 a p( u# _- 6 k |3 Y8 [# g8 t2 n' Q
, j! @; h s* p, N
3 ?2 A. H# }: f- R* N- 8 C+ ^3 L6 X( m; f/ i2 z f" n5 ~
4 s4 w: r, M* D+ a- 2 e/ N. G1 D- P4 U1 \
# E. |4 F7 _7 ~3 W$ |- 7 r4 d& \$ q% z2 J6 X* \
( O% P; _2 Y% k% C# z! X& P; z- 0 a( N5 D$ H c
9 b# ] ?( V. @/ |- 1 P; ?; A0 X$ U* c0 `/ @' g
. u6 L% C* |, z; p* e+ `
2 }; `, l% \, G( H: x! H. g
* n; q* {; W1 O
: r( _) J! i: b/ z
/ R) k: g& N3 [6 J
4 j$ r" Z, n: S0 Z& z( o5 q4 Z2 r- T- 8 x8 s8 a; q/ y e( M; \+ x
- / V2 s2 m8 `6 Q$ J; ]% J2 y
0 e: F g5 r" x' b _' X( V
2 M& [8 Z& \+ h- p* a8 w* m1 f& V
( J" E/ S8 L4 C
7 `- v$ |- n2 N. S
4 B$ L' A. |( i6 s! }& _' y$ U
9 g7 l3 F" o/ W0 n2 L! ~6 L8 m# y
5 w+ G- o4 o& o+ C0 w8 l- " ~2 _: v. c# y8 M' d$ j$ r
2 h0 T! c8 Y$ \ o2 Z- # G2 u% D' h3 t+ O* o
- % u z0 d. K/ g5 E h a
- ) y1 A/ ?# ? B
- B3 G2 R. L# L% X
* X8 }. N# ?* i+ z+ a8 B" I- C
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))
. I. r3 n/ L4 k( @
" e: m# Y3 _# I+ ^' ]; p. F& R+ Q" Q) h
颜色表:
; U: a7 u+ H7 |& {% Q7 @
" L- m7 x2 s' o; U2 t# Y |