|
气象数据可视化主要依靠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 ]. c I! L2 d1 Y6 Q1 q/ [
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 0 [, E/ }$ r/ {7 G' G, x' A
{, Q2 r/ v6 m; ~6 i7 o. a) c, {- ( h7 B% `& r' H3 i, f0 Y
8 l* r# Z8 u4 B M) M5 o- % B: h9 [# i4 A' T' ^
- 8 d( r! R/ D( d* i9 t c4 p
0 b2 X% E; b6 e( n- 3 `8 `+ P# i9 g9 G
( U; Q/ @& m& l* ^2 w% G- O* q
; i. R( X! H/ X ]+ h6 T; P
! }& i0 r, y4 d! x" S7 Z Q
/ S& Z7 L) c$ M+ e" Q- * g6 s# Q/ i! y0 e- M/ `& A
- + v: ]3 a% S+ g0 Q4 h% g
- : G% v; s& X o9 u0 T6 [% o
& J, Z: u V0 {( n ~1 |3 a
1 C& @6 p* a" p+ Y0 @0 z8 o- . u3 b3 c6 _# }3 l) T* B
- , y0 ^ Q, j5 v0 h% @; s) K" x; D
- 6 m. h: y; T& V! ~9 e2 w8 W
- G- N7 y) q4 ^+ @
/ H3 i6 p: c6 y; \$ T/ B- % a9 o9 H( N" Q$ [7 p* H1 O
+ z: [9 q, n6 Y: r
7 ^, _. Z E2 N# a- f( f) z6 k, P7 ~8 X2 z. x3 }6 ^9 ~
#绘制中国区域基本地图轮廓,包含省界#引库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")- S3 [+ n" f S @: D8 ?6 k8 F
; U4 p5 V! ~& g, E- `5 f$ m/ c7 K3 n1 k7 n
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: \9 w5 f3 i0 v( f- e7 h
9 l: P7 T) r" k& H7 x- 9 K$ {. A4 b$ e9 k
/ x* f* l: z4 F: E' _. a2 G7 G
# V) G" @# w8 h6 F1 j) r
' h* } M0 B- t8 u- ) B3 d! V/ R- K1 z+ S) B
- + Z& X6 l+ B/ W" t3 ^1 Q, g+ P; @' T0 o
8 ^2 o/ x2 z U/ J' T- % L- }' T3 W3 _ m) V: W1 Z. \
3 {+ ?* @* x4 j+ A' o7 k
* G, h8 Q: o1 H' O- D; A8 O; C k
' Z( K2 i1 l( Z; j5 s) o- p$ j$ c! h" F2 }+ K* Z
- E# \. e6 q) B* ?
; b# f3 n8 ]' t, j- T- % s2 A* Q. c% K6 p
) M. R2 c: m; L$ r
( s. i& @$ j j4 ?
. m" k6 O4 w& R$ \/ ~
#绘制中国地图,并标记各省会城市名#引库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")
6 i5 M" r% A! g9 l1 S! P* x
% l$ I) G3 B2 y/ h! B1 A. R1 a% l% [) y8 h
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
% j% r9 k9 L( f# v" u
^- w8 ^* q6 H& Z
3 C' v5 [- f3 t% K* h$ A, e, d5 b- ) C/ u- q7 l- e
- 6 `7 ?, L4 X" p* E. P
- + k' s: t% I# ~, i$ v
- 5 ~* n& i: T) p2 y% l) M& p' o
7 N c5 x3 o7 O6 o9 m- : O* g6 H+ s# u8 f3 T$ S" F
, E5 F. c3 l7 X8 R, S- 4 R1 K2 C4 w! z
; \/ Q r0 h! s& K' ]
- @; i$ B k- D9 h% t
2 I* n0 p9 W3 v/ p1 J
1 \6 ~0 \/ d! @6 n4 j
4 k8 x- R# t+ [6 x
0 n' F) U" O/ _- 3 x$ Q* \5 `+ B+ U/ T, D0 @
* t& g7 x# p: y4 D8 s6 V
# l6 ^, T' j; g! b( |* D
+ W9 V6 e/ m/ H/ Y
& b0 g6 |; H! n6 [6 j& X! I* y; V" m
8 ~! m+ Y8 H/ a X6 X# x* O- 9 v. H* e4 V6 l% s
- 6 S# }4 T/ Y) q- t4 _: j
- 9 o6 h0 u( F1 }- C5 {
- ) \: ^8 P* P! h# U2 l' f
- ; s# K1 ^5 @; R- @4 `/ `1 \
- 5 {% U) |: ]$ C# B& N* K
- m2 d9 A0 m" ]. d! |* M
! U: a4 J* w0 E1 n* {( i
3 b& p9 Y0 e* l+ I- \
; s, Z0 m1 ` |7 w1 ~- 9 i: K/ h* Q0 K" y2 G9 b/ g
4 W- v! f4 S3 y$ Z( h* ~0 P5 s
4 t, k, ^8 r; n9 H9 `- ' D4 j' x% Z5 X
4 Q, y/ `+ K. |. g; P: v& k
* ~- d7 b7 c8 V% b7 n4 H! G0 I" u2 E- " Z' [$ o. M; M1 M. v5 H+ H
- * Y8 e$ u9 b* \" P! }9 C
- 9 y( Q9 c1 ~1 `; g: K$ x3 G
- % I( O5 |7 g- \" c6 { S6 L! l3 z
0 B. {5 w' r ~; e5 Y# y* j
' `% I% E( P4 ~: K* f! t- c! z P# N" E
" P+ g2 N3 f; q
( [: o. ~1 i) }+ b( [
- _8 S0 v1 _1 E' ~
4 S1 T2 V# x$ U5 y' y
. Q9 {0 @! L5 G. W
. ]. D$ e, Y0 N- - x+ K* ?) L4 N) U
' {! ?$ z' I7 O4 _1 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()
( N4 y; R# D, A1 B. m
9 h6 E8 Y' {2 ]' t$ a3 B z- a6 w
4 G( _7 \7 l) M例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
; h) u1 f8 W$ `/ [* P' L: ?
- _/ Z, M& t- l S
3 c/ b: E; `/ s( ?! j$ V
& x( Y, P! N5 i& M9 O% y
2 g) v- r6 }# u" j5 J* n
9 v: L0 b7 {( `4 g
) z8 j# g( B& C3 M# n- & X) c {8 ?" E
9 n. r$ Q; s0 A& I' D- |8 S- ' i- n& j- ^) M h) Y3 s
- q, T$ K! M! J& D2 ^- / O3 e& z) j$ c$ T. b# _$ r3 Y
- . u* [1 v7 m9 s1 A
% d( j0 L$ V7 ]# K- 6 b* D. J( Q: v8 @- D4 ~# ?
- ) l2 ~" O4 S$ W# W7 V% |, E
, K0 I. c9 C9 B
2 g+ h# s8 V8 x; A- . R6 F9 F i6 f0 Y6 J+ R, T6 a
# z: A/ Z L; H3 Z7 ~* N: [- ' @- A2 u4 Z |: U9 J
- " h" {5 W. ?1 G- f
2 [2 e% U/ Y6 N1 r. `3 Z* v- * W) l2 [5 R- p; }% [, R
d' D6 t5 k A+ W: B& x
5 E% X0 f: q3 s
. Y) \" p% F& p- " Q. U' [8 \ B; P/ m \2 H( O
- : W) x% z V; W$ b( }
& n( {& E# T$ I$ Z- 9 b6 U" t _; }
- Y7 T8 Y7 m, U( a8 h; E
- / f ~* v- l( S s, g' F+ C; Y7 G
- 7 G" {1 D! P$ H9 t- n. y/ K
- 5 C" v! [* h! ~3 Q! D. M
- - T$ A) k; `+ Z( m C! J( L& q
4 ~0 l h7 O. w2 V& p3 Q- 3 N' h2 t. [/ h& e
3 f6 Y; _; m" x- ( a9 z1 v6 j+ }! k3 [
- & H2 N$ Q) ?' R! q
- ! n5 {5 `! A w. L
, f, E. `! J) m7 _- o& }8 t! G
#例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))
9 `: l& k( e! K' K: a- c
7 @5 k$ ~3 `1 S+ s$ n8 p例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
8 A1 o4 {" v0 p: J
3 U( D& [" Y8 D0 p! ?/ l: @- 4 @( S- B# {) C0 u0 z" t
- 6 R; Z7 I# H# t" ~3 s }
- % y3 d4 k/ a3 L. j6 f2 [" _
+ _) _* ^0 N+ A+ B8 n: Z
$ l6 K0 T. l3 N; y" x) r0 [- ( e) g: ^! y- y7 |6 J' \+ n
- . _6 O" S: H3 N: C+ q7 B
I) i$ o* n o1 W2 Y0 Z
# P* Z5 `% T6 X/ D, X2 h! `- - x' T2 U% O f5 n, l
d1 m0 C. S/ D3 D* ?, o* Y! Z
) O3 a7 s& q* a" x- # @5 K: X0 z7 e$ n4 t- K" W* \$ ]7 p
- 1 [9 P ?- `) {3 n
- 9 T8 C- A5 L) a* h
|, {' F/ o' F) z& |$ F$ l- / \" l e1 o ^8 k* z
/ h) R7 _% q4 W0 e- ^, K
1 \* q6 z# j% }
' U* F- M" ^4 ^- j+ y- + T5 n% ~- L# Y5 | j" a
- / M# J5 R& ~' W5 O7 t' N$ C, `
- & f' l* h, A: Q* s, N! F1 r* D
/ y& F) h7 i4 ~' k/ V
) ]- L, A% O* s: l$ Z
; R2 }' D7 u2 l X. g& o7 t7 F- , V; _8 j* r7 a0 r
" Q$ g$ F- f' V
; w$ s) i, k$ E) C( o
- b3 \. l/ n; I
' j* R, P+ `6 g; j- ( O8 z" Z- F' P
8 g; F5 F5 g6 V* A$ C4 F
- d/ F5 z) x) z- ) ~7 e" ~5 e+ @. q: G
- - T- m4 ]* l* \- I5 i2 v
- m5 h" K2 V' }" H5 }8 C
- 5 A. s# B& p" G& K
! [, S; e' y3 ]( _1 |2 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)) e% _8 G$ L$ }1 g. u! Q
, }; Q; x% i3 z7 M% E( M
# z/ m8 M+ K2 V: P# j. V' D颜色表:
' d j$ M1 I% i6 m. |7 Q
2 P1 ^) N8 t7 ?$ t; S |