|
气象数据可视化主要依靠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("···") * P) m% V6 k8 }% }% Q# q" R% C$ d
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- ) i, f/ ^: l; O
- 0 @& I, x6 }3 }7 b6 i$ J
- ' y8 \# v( W/ F- c( j5 X
Q; `# y; D( t- 9 [4 i5 C P6 N0 z% c4 K7 j
- ( M v" k1 A( N7 N; Z
! l# y" ^- h' h- r. }/ V
- t4 t- C2 f+ O1 j6 P K# q3 t: K& {
& j$ V: `% w; E, x# M- . f8 h: W# d& x0 m% D6 X
& O3 L0 d+ m/ u
2 @+ _4 |2 x4 `5 L9 T' P l% b+ s- u
2 O- I8 G& k1 s! C- : K) a0 u4 `4 N
- 6 \0 W! p1 w! K' S# f
- $ h( G/ v( x' T! W+ |9 P% P6 Y P
7 O1 }! U/ E8 P' ?7 K( I0 V" i2 E
" {. ^* ^( m) E
2 g2 P/ `6 b7 w, C8 v0 D" {
" J# ]% y7 n4 T. ~, O3 w3 X. U- , }7 s% v$ M% g7 F) J8 i
2 p4 H, n: ]) h- s9 S u' V
% g# [$ p# v& j+ ^" E8 d3 L
% J! r' o4 v" c2 l, U" @
* v$ R4 ]$ _& o" Q) @6 i4 q" |! f
4 T: Y* P. \7 B$ ]: \; I0 `# g4 q4 y
#绘制中国区域基本地图轮廓,包含省界#引库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")
* m% ], v1 N7 [& w$ e
' t# `9 Y- Z' X. O+ j) q( f7 S P3 b0 r+ x9 p/ d
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 K% E4 E" r6 A0 T) F4 R$ h
& b5 ~! ~8 w" s! c' h/ |* T- / F( N" S( R. |/ X6 g6 s
- ) f2 c6 H" B9 F" P5 K8 T, t
- ) A0 q' f$ H0 L7 R
- D6 m5 ]8 V i
- / H. Z& S3 H y0 a, M8 D7 C
- : L4 G% ]) n* g @9 e* ]# H
- 4 n4 d- @3 D5 n: Q
* l$ [8 Q. m3 b- 0 T4 U( L6 W- _1 D0 Y
+ a, [: s0 Y$ Z+ R! @" u0 T
' _$ H; V. i' ]8 F' ]
" L- K- Z0 H# j( e. y
6 _1 G: \5 B$ I. \- 4 a) R4 b/ ]4 t8 D0 \
- * r2 O# r: L- U1 b- T
- " a, a1 z* H; s F
- / o% r8 z/ _/ Z, \* H& }7 w; {' |
, E1 V0 U3 g) L) g x) v5 y% g
#绘制中国地图,并标记各省会城市名#引库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 l& d0 n5 x3 e! d8 c+ ]
' s2 l9 n% ]# U1 G% m
) D( v, ?5 n0 j: m6 q
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 l! M; k8 n- w- b R' L$ C- ' K& O6 [5 s8 k3 C2 k f3 m% ^
- 8 n( m) @# y; L9 h' G5 w9 R8 C
- # t+ Q& n( L! B2 h
# t* f; \& {0 s8 {- 2 O9 g0 ]6 J+ ~, i
- " N- f5 c. Y3 k
- + f$ X _' n0 ~4 R. a
- 4 M# O# C1 g" C1 B9 o: G
6 Z) _' |& s! H U' ^
& h: P: E* J! x+ O) c- ( l" z; V/ I" y4 d) z( J: _7 k
, K3 l4 Y; [+ V8 A, ^% g
5 Q- z2 \3 _* q Z% V% I
; L7 J b8 ~; w, U: B" G$ D- ; A2 g2 ?% {6 _9 n7 B$ H4 V+ _
- / _: E$ N" W: j5 [. a( y" ~
- s- o p: p! h- u# n/ e- o- S7 v( S' d, r8 }/ i, U1 d
- 5 p% V7 M* N" [ O$ {& a
1 O: @2 p4 ~" n8 Q7 B0 c
; F' g6 W4 |" X# L# m$ g2 m: a- 9 O& I* G0 A3 @! L M$ X
- r4 t5 {& U; A) Q5 Y2 u/ Z1 e. q
0 I( I) g7 @* E" V, s- a: |- g- ( T* i: h" S' n
- f; v5 A7 m/ Y, d- j l8 E* G0 |: D
* {) g! N2 S3 Z& G' ?5 z: l- 1 B2 J3 D! \5 B; ?, w! P/ j1 w
. E) L' ?* L$ `! F4 W
+ H) ?5 O1 a% a* p8 ^- 7 x! {# w. {+ _& Q
- ' Q1 o. o% r8 h; R- i3 B2 l
$ N: M3 t& B4 A3 r5 a! H
/ ~- O& y( W0 C' Z# {3 T
8 m! Y- w/ e% E1 c" @/ ]/ i/ ^5 a
% c' {* b% T1 Y* D3 d. z8 L: C; h. E( ]. r
# G# T1 ^! K8 D# k- & v. H6 I! q6 U7 p
- : ^! V; A! T1 o' d5 M7 @# j$ F3 ]
- 9 \4 o3 w5 I& j8 k" x. r; E. ~9 o: \
( u. s; Y; n! a/ y- - Z: }0 {) W/ r8 }: W
. t0 O0 i% M$ l0 C" C9 w% O
5 k, U8 P# P @+ G( y$ E% ^% O3 I$ u% r1 i% G! e
- 2 R& P, j$ ~2 G U
- * V* C" N# l3 c" Y0 A+ ]
/ f% t) Z- e5 O( L* X7 j, p
) Y$ x- V, M9 W1 h2 ]( b3 _
/ R7 \4 y3 @: ]3 F7 D+ C3 E- 9 S5 h4 F( m7 y1 H2 C1 h, g
( F3 B- F* n( ?' {/ B2 t: u
##绘制有海岸线的中国地图#引库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()
$ u+ g4 } P+ l* V. j' j2 X
* v/ S& Y+ P8 S( d4 L
: `, y' l5 o3 q# T例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
! ~) S6 F: p! {/ q
` Y' C [* s9 b/ u# n) D0 b; K- % g' I2 v+ a0 F# I$ C
- * J! J! T0 ?( F9 _8 }9 u
- , R3 S; Y, c" m
- 2 ?5 x1 L8 J3 Y8 {0 P5 U
% P4 U' q5 l2 J1 r. O: @4 u- y- 7 C$ X, W |4 l) ?( N
- 3 j/ v0 @1 w6 M" ^
8 l5 z& S8 Y9 R- 4 w7 I/ f2 u- M
6 N5 \2 W( N; F
J l4 E% |7 m+ H5 N- ) Q$ b/ L( g- b0 }9 w
- A k! ?5 M! _" t
% f' Q/ q3 _( C" p: \- 8 H; _- H) [6 f' p
- 1 l4 E: t- B0 v, b
$ _1 m8 ]0 B( c, N. Q6 R8 X
9 E- X) }4 ?% {6 l/ F5 |5 y) I4 i; `
" ?- I) v0 X! m |
" d& J) j' _7 W7 r0 Z- ' y5 m% b4 v X' q$ I
' w4 C/ ?1 N9 S* X9 w. H; `- $ @8 U8 G! t& O# x; s. f+ I
6 h$ v# v. j: j! P; {5 y3 ]- . z* L& d. B( r. ]* s) W
2 G: Q% y2 u$ n
1 `5 B: N( L3 ~! I- S# W- 2 A& A8 S" U- Z" Y n) d; v
- 8 g0 I& ^, e' e6 V
+ z$ I/ R4 i7 |% l0 y9 N. t- 8 F8 V$ H0 X! q# c
- 7 _1 R" n- l8 z# J8 _3 d
- * c7 u7 \* {; p3 I' X
- - `7 S) w3 D: A3 o6 `
# E2 v4 C' K, f) c8 z
" B- e& N! h2 _5 F& t- R" W- $ F; f% k* k! i( l, V/ O
3 f* V- a4 ]' w" s" z- # q* o. z! }4 P/ p+ m# W* [+ ?+ K
% b9 [ d, R( \7 e" J
6 _' F8 E) c( x+ ^3 f' V
#例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))) t: P6 S+ I+ U+ X; l4 e
4 d0 F5 W, K$ \2 v0 x
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
3 O% q7 n9 n1 T- $ N5 ^2 n' k/ y9 x7 A
8 R; Z* M9 Z+ G T7 y( [- ( W: I' h3 s$ X& _. T- X# H b6 u# ?
- % P& p, f# G, o
@2 e) i6 u E% J8 U; R
5 y' ^! v- f* W
) R! k1 V' e4 K$ D: P l- 6 }" w6 b! G4 L! J
- ' k( o: q" g1 @& G5 ^
: s0 l7 @+ @+ o1 ~/ N9 n/ x- ( Z f. y; ^' \$ q/ [
- & x. n6 o3 Z2 W3 S
" k' \! w5 r3 v( t5 ]1 y( z8 i- ' {8 X6 @% `: f+ f; s. l9 [
: p' J- B3 o% M! M2 g+ M# d- 9 |5 s& O, X# h+ {. Y$ { m; W* ^) v
5 |: @9 D" M+ i' g' N9 _% G- 0 I5 v- [$ i l0 v) V7 R
, ~6 y- D s2 F$ J
9 U, g! W; ]0 t$ K+ d8 e0 H
* M+ z5 O& F$ P
: _* k5 a, P: k+ N& P- % {$ I5 b# `" c6 U5 R5 o; P L
$ _# r2 y& v) B, g% D- i) n1 q4 f
- {" P' m4 S# B! ?2 |# B2 U3 t9 j- . H* z7 r' ^! i7 ]" e/ r. V7 u
# z9 u9 z2 B0 F: f, A- k0 a
9 d7 Y9 r; ]$ G: V" z
4 g6 n& W- w* a. \$ d n
) }0 M9 m1 {; ^2 D6 ]- 6 E/ R) q) ]" U2 P% ~6 d; G
" H+ ~( _4 u9 r% f
* |8 B; x: j1 f4 l! c5 |/ s4 l. |- ( J0 g: I3 m {
- i1 Q" j3 p- x! |# c- 2 }/ F3 ], a% `0 Y5 ^4 p
- 7 y, f0 p* z. f3 J
- ! h& o/ j9 n& H! s1 A
- . [0 l/ v8 ]4 ?) ], A/ l
9 V$ C T% C8 B! R& b 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))
7 T a3 ^, S: c. P& T* A( S8 ^4 t
6 s& Y$ v8 m9 v2 a r' T
- n T2 A, }' d$ K/ m& m2 w颜色表:
* ?* X6 z$ E, K5 y; G% ` v t. _8 P( {# d- f$ s+ p
|