|
气象数据可视化主要依靠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("···") 5 P3 c" g- i, U! o( l
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- " [) B" d6 b8 ?6 P" [) Q4 `
- 1 W! p/ r9 J2 [" L. ?
- 4 Y7 t# X8 N% Q: C: k5 ]
- # e' e# c7 t# O2 v# P. T3 m
( s+ e ]" N$ @: s- ; h2 U5 O) C( b: y1 U: `
& n" I2 a3 h; T- / U9 |- G) v; d8 V: m% j
/ E% x; J, ]4 K @% N: j: b2 @
0 I) l; F/ M( G
5 X5 i3 ~) r4 |
3 a2 x7 L4 K- t) I. j h; T' q) F
' J- e# v* `5 Q7 `
- Q" l; e; H7 n1 ]& \/ e3 V% @& o- , ]* j8 u! p" V/ Z/ i% E) H
- ' m+ G' e9 L8 [0 D- h ?8 @
h" b( C5 L' v, l1 |0 F- # I5 [7 f& |4 f3 x* v5 r0 u; E
1 B, [4 w4 U; G/ p2 U
: H1 u2 c* U6 i" D; y; G. K; O! Z
9 |! O, }& R Y7 X: O6 K( D- * `+ N1 F& C# O: C
4 v3 {! \4 G- N, A* m( z- 3 X5 a3 _2 ^9 r, p5 \- w" f
: T& N' D( x4 j9 N4 q) I( V5 N$ B4 k4 Z2 j: h9 O% A: z, d
#绘制中国区域基本地图轮廓,包含省界#引库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")
& X' `0 h( \: I0 b+ _2 b0 m 0 ?5 e5 J- r! `9 {. I4 ?1 @- ?6 c5 \0 B" o
6 S) q% v! \* x: n
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
8 N$ S8 z* F6 V5 t* P* P3 f5 c* u
- / h6 {( s* O1 r; P- {) e5 a
c8 G5 G6 ~$ h2 [- $ S" l0 {* p+ z6 V( z
3 @) q! O& u/ ^! F/ l
U1 o) i! n1 O$ U4 S f! {$ I
; h* b4 g5 T% h/ Z9 Z0 A- - R9 p4 L( P5 [1 \! J8 C) c
- & o2 L) C5 h, i, Q" b# P t7 y( N
- 1 G6 ]8 [8 n* Q( K
- # i. i: T5 B8 u, c- f7 C
& F; s5 T/ W* l1 g, B
8 w9 Q* _* b% V) d9 |# N- 9 l9 |) T2 V( Q9 y! C/ |' p
. J E' n" P! J- 3 D8 }0 `0 g6 C4 Q/ K0 N# {
+ d$ P3 s3 j* @9 U) e; h
( Z6 q4 e* N8 t8 x3 i. B3 N. i- $ I: R. i% F- H7 {1 m4 _0 k
0 a- X, j: b2 U# m
#绘制中国地图,并标记各省会城市名#引库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")
. G: m, y8 D' ^1 Y) x8 Y, v; u ! Q6 B: |7 F3 \* h- e
+ {; s# a6 q% F. q例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
* P9 B2 l) w6 {8 }! H* {
& h9 P+ `) B1 }; [; q- ( u# m9 K, C9 ?! m& ` I
/ P1 M! R' K) M" z) {" y
4 t+ \' W( W) |% _: G% P/ F. W! d
# K4 {3 S _' ~- h4 S
V! A3 I0 H$ g! s# K8 L- " ^6 J4 H! x7 o
/ A9 i! q" L9 t" t$ ~- ( D# E' s! |) Y4 S/ v. I5 v( g
- $ ?2 g$ z( v* k) |9 ~
- ' r! F# H; s3 P4 t* `% i
- 0 l5 c% l. |" u6 G6 l1 ^: q, d
2 [0 s4 ` Z0 n- # o$ N" G9 y! j& N
- 4 q- D: i2 R) l5 A. D1 u& S2 H
- ) X% ^" b- j' ~! A& z1 y9 [$ {
! Z' h0 p9 x, U+ \
$ J- A$ Q" f3 y/ c/ p
$ n- d+ L0 F7 N6 B$ }7 ^- 6 r9 r* z# O' Z* q9 F& o" G
- $ d: s. V* O& ~, A7 Y/ k
* s- ?' b* B& M" A5 N
: L& d1 l* h' S* x% e" P" W
: G: X. o) u4 w0 V6 V3 Y4 |& Y( m- 6 V. x* Y: l0 P2 m0 G: r
- ' F, U: k$ X' c, K( D+ G- y: Y3 u
- 3 B! R+ D* h/ |" U
! z9 R# `, L7 {0 ^/ M
( U, l! @& ?0 t# G) |: n; o( f4 c
6 r2 C% `, w0 x2 O d- I# n- " d3 N/ L( I, G o* G
- 0 D% j% g/ E" [# g
' g( y) e) y/ K- a* |3 z- & w8 L& j% R: X0 S
% C8 \3 z5 g! K- ' Y( I$ j, V1 y. a$ l
- ' J9 a9 r8 b* e, C
- 2 ]8 A" i% Z3 @
- 5 P1 y( N9 y, C* c' c- J
* \( g( M# E/ z8 Y E3 T
; D7 J6 M* h; _# D9 K2 Q B
' E+ n$ ]/ y0 a6 t
$ h0 I5 R0 j! n( X e7 N4 @- v
/ j2 ?- c7 V1 @ ~
8 e& d0 l0 b V9 P* _
4 [4 N: P0 r7 j7 u+ r/ Y- $ C" c9 j2 m7 S1 u
- 2 p3 ~1 F* }/ F$ h- L
- % ^' r& M* H3 B$ E1 a/ o, e3 @
- 6 M7 N! W6 p# ]
& a& W7 `, e9 S6 `. C6 Q3 B% w J' b k, @3 n$ Z5 a
##绘制有海岸线的中国地图#引库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()
/ q- ~$ o% X# E0 V# M2 Z5 y
- V2 K: b0 r% Z+ ~ c/ s' v( j* g6 A
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ ]* m6 D4 P: H- & c; E2 @& b, z/ j% s
- $ D$ r9 ?4 |0 T8 k
1 u/ a& V3 M. R$ V8 g
- w Z" v0 k3 v6 R0 @8 |- ) U' w/ h1 s2 L5 S7 o. y0 J
$ j- M( W' f8 @4 y: K- / K1 W0 V3 |/ K3 D% w5 ~4 }
2 q. B5 a% ]1 O9 i) ?0 d
' |, u4 R' c' i: j- 7 v- q' g( Y& ~- d3 ~
0 m4 l$ P; B% ^( |9 W- 3 W+ @! X* H/ {) W
1 G' R d2 J+ _% X" }2 r% u W/ V
4 n' n, R3 w0 P( `6 u: m- 8 Z/ i% A% D5 e3 p7 R: J4 U
- 2 x1 }4 H. x3 l/ X2 f/ G" i
- $ a0 s; F9 J$ [( |# @, K
$ \! E- Z0 t& x# t2 R- ; m' H3 N. ]0 _3 A" e
- : y/ q+ F( I6 V/ ?( E
- r8 C8 }8 w; b+ k+ M5 w
* M6 k5 r/ s$ O# \$ e* ]
; f4 f& V" r" W7 z* e1 V' l
, m$ K# T: S: [: B8 J: {* n
8 W' _+ ~* l! k' H1 u
( S1 X, q% g' {4 B9 O5 h: L
+ |. _4 |( p( z, d" p* T1 s% B
2 b, i g2 Y+ K9 m6 r
5 B6 V( J) ^; N/ l+ o
3 z& {- X) Y) a3 x; x$ X
2 t, a. F& Y, ^
! P* i+ n0 n. C& N& D2 G- ; Q1 G4 l ], a; F% d) }- p. E6 k
! J1 v9 R2 _' N o- u0 ?- + q9 ?, M% ?$ U: f+ o# y& E! X
- 5 V/ f+ ^+ m2 _5 d
- " }- Q+ z6 o" Y: g& P8 l
- 0 w$ Z( D2 k6 Z( R
- 2 O4 O" P( x2 E
- , ~0 n- Z- v& ~2 f: a* V
- 3 B2 Z. ^- V" g; h& B
; B, a5 k! E. g1 s3 \7 F: B" _
#例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))
/ L2 w9 U7 H4 ~' }3 E+ @
3 H7 h" `9 k; Z* w8 v( [+ C! {' E例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
* i) Z! m( g0 A+ |$ y- 4 M% U( c, S m$ y
- 3 H3 W5 C( |* I
: p; q- W: F: L6 M
* _2 {$ `) {8 x6 q: |2 n" Y- ! q7 ^5 D2 i3 v% H' |
: l/ _" w/ X/ T1 l8 a$ R7 h) {
6 e" N0 C! i# g3 h- G0 `: [- 2 c F+ q' Q, B" m, {: d
- 6 }7 N3 B( u' V2 z' H, u9 {( t
/ ^- |: t! q7 ~! N
; [. ]4 ?$ q5 m: h- 4 v/ ^# |6 B& I/ T1 G- `6 `
- 2 s* y3 g' o, t0 U' g
) J4 Y; F4 v, L. v* N
9 q* p V; v+ ^$ `; U7 m% }- U; O# F2 T) u( H
- ; f: j/ n$ W! K+ g3 I" B P* V
- 6 \) Z9 P: Q6 r, L- n
- , B+ c# o# e, L8 }) w! s/ I
- 1 O6 v6 j% y( C) i F& ^7 h
- 1 c: W# j. g: D- [+ R6 o1 D
2 W! |) j D# M" E* T5 P* U" b- 9 A! `, H' E1 M2 B. J2 f
: j! [" @0 L2 F, F# ^' D( _( v; m7 u
}: j% [2 T7 ^- w+ ?5 ?- ' _( v- L5 o5 u1 Q% i' a1 ]
" f% I' I# M# }" h
) a1 i. ~( r( T- - @; Y1 H' }( |) l! _
- 5 A& J5 y+ t+ L: e: m1 U, d* d
- A1 f! n/ [3 s
- + ^5 l. l: T- \$ u# S0 {
- & V) L" `+ o3 i- {4 _) V% s
- & ?& x5 _" K3 w* E% @/ R
/ D: g0 X' ]& e) W2 e) Y
" U z5 w9 ]0 ?' L- 4 R+ n/ e9 o* `/ \+ f- F: \4 J% F0 h
- 3 Z% Z* ?# [. c+ |! \: ^: s
- / `3 v8 J/ X' z9 A' c2 n* v
1 P% w& J) |+ V1 O: a5 }7 m
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))9 y' X5 G1 k4 E8 j% L* ^% B
* b7 P' c* d! Y3 Z* i
* h8 t, p* o: r, O5 K* O1 m颜色表:
# J8 B9 ]& c( K& `$ [7 n9 M
5 C% ~/ [4 q; }" F* G; }0 \ |