|
气象数据可视化主要依靠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("···") # f1 A* G. I( U! h/ K1 @
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- ' X; |3 Z3 U6 `
- $ F- }; ] e0 t9 F7 \/ u! Q
1 P- c# v9 q( o* t
1 G% i& S. C+ a+ m- % \# h$ b% U0 ~. v
) d* ^) L: }" p. s1 g6 a0 o2 c+ p- ' _ A& Y0 p& k, O
7 k* M* j! D7 P) c- 6 }7 w& Q3 {# D e: _ r6 j8 m
- 0 U9 Z v" p0 u' W0 y. }) ?- M
- ' X2 r9 [$ n1 p2 I
- : y! y2 C6 G$ D) f+ J. q/ U$ a
- 2 z0 B( @$ \- N5 C
' t. E6 \' R9 d( k5 A+ W
2 D& F8 ~' ^; v2 q- g6 x* j- 0 k @+ Y, j8 {- A) m, K
1 t& E9 P# f8 H7 j3 H2 C! I- . `; `( d- h& R; a2 |! E5 W, y* C
0 p' p/ x) c% F8 {5 o1 j& }; a
- y* k0 H5 j! |% f! b/ s- ?: R" ^
3 i) J* x9 \9 T! R0 X2 {
: e1 t3 s9 J+ `( z- : f, x, H2 u/ q( C! d Z4 S: P8 M
- 8 j/ t- C6 Z2 o
- + m6 y& F) D' g9 O4 }% P& P
5 K# o# l. }' t f* 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")
/ _4 v, n2 }( W8 l8 C9 r4 P0 b
9 J& V3 t# `/ H. C3 B( U& a# r
, M" l: G z- M3 V例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
8 ^/ s6 M8 C7 X* a, B
$ p0 n8 U# B+ M- ; K% M% k2 _8 w6 j) H9 E& s
- 2 V* g2 \7 U" M5 u
- ' z/ E3 z+ e+ k6 q6 n! ~
- 7 R: R% N1 a2 F( Y7 f i8 ]6 M: _
* N' B/ i, n! ~% z# C7 K
4 c# F! w' [- o. R" Z2 H0 ?0 w- : Z% G9 f' a( j v+ _
3 e2 y# e9 S" G# u/ [
: x0 k( o4 D/ b5 O- , m: }" i3 K8 u/ e1 |" v$ A1 E
- ) i8 [5 K+ \$ \* j
- * X1 ^ e4 z# B0 G+ i' d
- / I8 k& j- y' _/ B% a4 ~
) _4 d( x5 _0 c% f- 9 W+ v% G! P0 I+ F' Q5 E
4 Q( ]& f! w9 h, \2 {$ L
1 }* E% V$ O6 { h/ U8 f1 @! l& p x
#绘制中国地图,并标记各省会城市名#引库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 J9 L* G9 W# s3 Q y7 S! _+ N, R( j
2 V, i. U+ y* Q H! @
1 U9 V: V D( ~+ {例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) @) ]7 l+ o" N+ _1 V& x$ D- s
( C$ m0 @! N @
5 l% {; @5 o, i% Q2 U
! Z4 A$ s& J5 Y% Y: y, }- ' H' `7 k9 ~ L9 A! p# i& x3 ]
- & C7 |+ k, ]4 I5 A. z, v0 U, i8 E
8 z( [( P0 @. n9 K) a8 V* T, f' a
, W' W8 p1 P# l$ }* `
) o* ?1 v/ v5 u- W. Q5 a; H$ g
/ l! _# _, X, N b8 [& Q% [% B- $ v& D. t$ \4 d3 A3 @: N8 b
+ E: F/ i+ }8 I' k- ; k) a1 ~0 ~; c4 c# j! S
- 2 J/ h* |4 E2 x Y/ U! p
- + m' h5 s% P* C
- ! h) q. j: s3 ?; a _
) ]4 B" e0 V {& I O2 f3 k
2 f- {! ?6 Q4 g: `! q; `
% d1 L) q$ D# @2 [0 E8 q c3 q- 5 A' K# O+ @, Y9 @9 ~
5 B; S6 H% G1 e
& Y4 F6 { z4 g% F' T
6 y9 B8 K* V) b# S9 }- x! z
5 h( `* ?0 Y$ B' x- ( n' L$ `5 x8 R3 d% X
* g% ]# V* n2 ^' [ z& W$ u
8 K2 H2 _$ `9 `5 U: h- ; c, [; F9 Y( g! B" K
( o7 E; n8 Z3 u3 R9 Y- # c) r6 I6 t2 c6 V( y1 _$ Q3 _7 k5 h7 S1 {
1 d6 w2 z; [( c% Y
3 d4 y, e1 m. }; [
8 ?* Z' X( N4 d/ ` K) @6 L
# ?% ]: y( a. @( t" ?! J- ; Q4 U3 S+ }0 y* I& I" A
- & ]9 L) H$ Y* e0 H
- ; `; ~6 V1 F8 m! m$ v- n
: p4 C( a0 f; Q. P& C. ?
! B' h3 D: n# R! Z! F) |- 4 P& `$ ^- i7 Z: J$ Y1 j1 G3 y
4 }: _. c% x0 Y U9 k: l0 q- ' T0 B0 H- p" U5 U f% w! S4 C! A% c j
4 w% V+ t/ N: y2 ]& A
4 d1 F6 B8 D+ M7 E
* p8 k6 u% K" \+ k* ]! d0 g0 B% i1 q
( B% d3 v; @, \! i
; S6 k5 c* K3 A- w8 k! x' e7 c- , y) W+ L+ C% W: p. [
- 0 c8 ?" i! A" D. e9 D# G
- 1 ]" y1 @: V. M# f- w9 t
: q! s4 _ t. a1 @. m$ o7 k
U( H5 M" ~/ D8 o2 }- ~
##绘制有海岸线的中国地图#引库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()
Y1 ^3 y) [) J1 W$ z; c# B
" K& ~$ u2 C& Z, Y; F$ T) k. h( d) E P) }3 o/ ^3 V$ O
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 c- r1 a6 g' _9 s5 n- 4 b6 ?3 K7 r' r& v# O
8 Z& s( _: \: T
& R3 I0 y; B3 w( x' Z- ; Y4 B2 l0 Y2 T/ R4 ~8 h7 U8 h: ?
- & Q! F/ o) V/ u9 f# H+ I
- 1 \+ J. @. ]$ T7 _$ J
- : n z' r8 M% O4 a
$ r8 R7 u( f8 F- " T0 W9 Q, g; S* C
/ u' L7 Y. \1 t- 8 n4 K# C+ j, i1 I. ^; S
- ( w2 ]8 r8 r4 I0 `# n; ~ l* G% T
- 8 d% t! [ ?7 h
@4 r7 H2 S/ K. ~% ]
5 P7 s1 [; m+ h5 \. M
: ^# K6 m# I: c
\8 t$ c$ g3 B2 ?# K5 I) D
9 i% P, ]; \, w% ~1 U- ( Q8 u2 r& x! ]& z* |( g
4 z3 I2 A' q/ u0 _. Z- 9 U6 F7 ]1 K2 t- Q" i
- " v2 i: h, K$ @$ g. u. n7 b
- ' ]. J2 B9 [3 I) k, F1 ?8 u
$ o6 x: n2 q Y' x- ?2 ^- 0 I1 Q {: C2 `; A7 f; L
- : n% p: O% k$ q. f7 c$ M% B
- ) i1 g/ Q5 T' R. C$ }9 O, }
- 0 d) Q' D* O3 x
- 0 G( z8 w3 A5 y! b4 f& X" s$ y
' B$ w6 r4 |: t( J# g, y$ \6 @
0 u2 \. H0 ~* ]6 l& D, P- , I" [2 |/ X# B f& C8 ^- @
- 8 O1 ]0 w" g& z1 w9 o+ d) z
; r3 H6 Q( ]1 Q
* x4 ~; b* ~. ?% ]4 E- * T: z: x w6 i1 s
- ; G! f# L2 a" s: |8 B
* d( n) ~* T4 D: `
( I' d& d- N* J" l+ Q3 m0 ]* K
& \- ? Z$ Y5 k5 W0 r/ K& U- : K. h: H5 G) u0 c# m, {5 s
- i1 @; O$ E5 {. t' } \
#例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))
8 z3 U7 @' y4 u* x0 M8 s, f
( Q# a# \: ~; S7 c# g6 ]例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) 8 U [1 \' z" {
- ! u7 C3 s4 g& d: Q ~
' O% G& j) u d. \3 q4 l/ j% f
* @0 l/ D# X9 e. l- * U0 m* r6 a F$ u
' }) `+ z* q7 Y) J9 V
7 `3 |: [+ B! x( M7 U# }
( ~/ T% H3 j, X( w4 N, p
; r% j) V0 U3 ^* O
* f/ p3 N! e9 t& o" \6 w- + f+ M- j; L y9 x
6 D1 o/ z, U! B- b( Q$ Z- - i8 ?2 ? A% J
* m+ d8 i& j/ k7 i* ]/ b
5 z& s# k" k- d4 H
+ q7 i8 r$ m; _$ |9 }7 p
9 _$ ^' k0 L: i2 g+ @3 ]5 f, p- ; ]! U, C$ P( [7 U A3 ^# i3 D7 D! w
- 6 G9 k3 ^! f: z5 Y) d
- & L W- y2 a3 \
- ( D3 B/ `" @$ s
% Z* [; H4 P! E2 i- ! W# S3 \+ {! B
2 y3 Q& ~( C+ R" r+ v2 b- ! l, O# `: l5 A9 D3 y
b# t" [1 d6 ~: a8 L- 3 G% F2 l( U5 }8 L" P: Q
- ( c# r+ M0 N1 c/ ~$ H. i( w( {5 D9 Y
- 4 m8 W1 _/ h) Q( H. a( ]: _( s: v
- 6 [ n, O4 ^1 C! m% q p8 N
% |$ t: w" m3 h# I7 t) w
4 T, X1 d [: C" L; B4 W- |- 3 W, r1 O2 P9 C- g' s
% d8 v; A1 B" p; z
/ V9 W/ c/ d3 i" H- % m9 X0 j7 L$ o; r+ {
- 3 A+ ~/ D7 z" l" \
- 8 l3 F& k6 @% P( _
7 Z) P# o/ x3 g1 R2 z- # X! N; U0 W [- E1 ~7 Q
- \" p, B2 ~0 }* ]
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))
7 y2 U8 W3 c# o3 r# C
4 z: B0 o- S+ S( [
+ z/ |" Y( o) n' N颜色表:
8 v5 m5 P3 _! P9 t+ T R5 e0 L& m: {7 m$ x- K/ M" t
|