气象数据可视化主要依靠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("···") " L3 G/ B) ?! J2 h
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- ; s0 j; X4 g' R6 P! ~
- * _/ r: S* s! j0 o; ~9 c
- ( O& T6 Q* v. d
/ m. d1 a+ C/ `. k$ }/ s1 N- 3 g1 T; P, D+ a- q
4 L, B, I m- I5 a- * z- s0 Q' @( f' g4 H
- 1 Q. j% j/ {/ l# D& B
7 l/ Z w7 b8 u S% _- : C y, b9 ?/ s5 M C
- , E7 j# y" K2 @6 p; I' b- ~: g
7 _% M6 o6 e" u% O3 Z8 `
7 H4 P7 C8 H1 o: q; }# M2 v% a- ( l& q4 L3 E/ P) }
- - c8 ^3 t+ d* H, i; ^8 M1 E
- ! s- b1 {) F( k' B }
- 9 r; O% `8 {- j& @
' ]9 \/ \. \* X$ `
0 k. ^! N# o5 Q5 f; z- : w* p, C0 u; x1 v! j
- ! j- Y$ ^/ i0 T! t
- 3 `- |- C# ~5 {4 b
- ( @1 C, } j0 @+ n, M& N* j
" h$ U+ n1 w) c& E$ N
1 {1 r/ N* P, j
1 ^/ R0 o0 {$ _# j
#绘制中国区域基本地图轮廓,包含省界#引库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- H/ N# v0 Q1 ]! T1 [1 N% O* k
0 F2 N9 n& {7 P' j5 H! ^( c6 B
" K0 z) T) N$ I4 N6 c7 I: e/ R例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
* i7 h, Y) o0 g6 j; F- q
' C* o. ]" \3 K8 N1 U: `. P
n; Y8 {: m2 Z% o! G! c. t* Z) D1 H
1 v! r& [5 b/ ~7 m5 ?
. V% c& e, \8 @" F( Y; T4 H- / c( e* n: P0 \- ?( g
- & k2 `3 W8 a7 j9 ^6 i
- % u/ i' M8 |# h1 \" |
- 9 w& ~0 a) k1 Z2 W: Q! S
- . C6 {: z8 }0 D7 z* A7 W
; C4 U/ C4 Y, B/ C% L1 a2 \- 7 J: \% x5 A& i' [, E5 G1 u$ b
0 m0 C: i4 ^0 H4 E2 ^& d- 1 C" ^% T7 F B) {
) ]) D6 c- D, h! E) I6 W5 @
9 a( [8 W5 H6 I ?; ?8 K
# y s% ^+ F( a% j# D" A- ' z* G) }/ G( Z! g
3 f) g {8 x& l: y% P% f& s$ Q% f* R& q- ^ s; z' o
#绘制中国地图,并标记各省会城市名#引库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")8 F3 M& y+ h- @' w
% V* T" }: z$ D0 T4 B" h5 n' n
* g! b) G0 S8 X! i) H p例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) B) ~, k, B3 C+ t
2 L& q2 ?9 r2 O% g. u% l \- # G& b# ]" g* [+ Z9 c3 s
+ r0 x* J( z* N. g' I4 Z" w4 U
; ~/ y( ^" K& } P- w$ i- 5 o+ k! u- S% [
- % z, W* q, k* [" U6 f
o8 d" c9 `& l! y
1 s# j5 S% t( N* s
4 H0 h3 {: M/ u! P- s% A; \' A" @
- ; e- c, H' x4 C+ V2 a; ?
4 A& _; U# Q2 M6 [/ A4 P
) { l. Q! Z5 G- L) s9 z- , @, G: M$ o* n+ F# B
- ! O! t- H) ?# Q8 S) D
* @% ~9 ]% T3 I) ^# C/ y; }3 \
+ o% F/ R2 A2 ^3 ~' ~$ J
/ u7 N$ a; W% F- k: z% Q- , k4 ], p3 S7 T. J
0 I# v) C" C' S1 D" _# i+ C/ |
9 H+ X3 }9 o1 s) U7 t$ ^/ I' F- 2 z C: o5 G+ z A; i/ ^
( S+ G; `8 q. ?0 y# o
* e9 c" A# s) [" m+ A; \) s
. F% N' G! R* `: g$ Z5 ^- 8 Z s$ n# o9 C; e, H! r
4 e8 O5 \& H% i( b9 p6 _- . F" c h4 c2 @& B* Z
- ' I! n$ s# R5 H6 O% [# {
5 \; U: c" L2 w" A* Q2 V
# `0 h9 d3 B/ b8 i' u$ Q2 y; Y- # x7 B1 ?5 y: c9 G! z8 v
- ( ]' S2 J1 t) }# K5 n7 y
/ `5 `) D. l* q% [" L# Q( |
4 h+ G4 h2 _& {" H& N& Q7 H
4 X o* J5 \/ |3 s7 O
@! R& D/ B/ m/ Y( L
' k& L9 c1 D+ ~/ r3 c9 Z
( f3 G% ]0 Z% ~9 ^- s- 7 q$ R/ A* ?: R( S+ T) i9 t
5 ?( L2 z7 M0 u5 A( S- # d: b7 w7 g+ a3 d& `: @5 @
- ! ^1 ?4 y% V( F; J# k
1 ]2 e. u; G5 Y: q7 |3 M" ^ N K: A7 ~. Q
! q' l/ y+ W Z/ V- ! I. O4 g( v# i* P7 j8 M; j+ i4 _' ]
- + o6 k- K: U2 s5 H" W
- ! l* B9 S5 s/ ^6 \+ s2 F1 w
$ n+ d" b o; ~1 N- % {& d% V' ]9 P" b
5 ^* L* s: m8 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()
8 ^3 {* c8 E( S
" t; E {, `' P/ @' F6 |! m+ a- \2 }, J# w& ?
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 i. D/ l1 g2 v! `* H7 X- ) ?. {4 P. s" _% @+ f0 L. T* f- A$ Q
% l& i" f# H9 S6 N7 Q
( w3 s" w' z. {+ ^1 i. S- M
2 e- x+ K( _& q4 h! {9 m8 D
# S$ K; S: }9 ]3 C8 E r# b0 T- * `/ s/ }( x/ i h
/ Q6 x$ E4 ^' g1 S, S3 b
1 F, P- a+ U0 k4 {) h4 y8 x" y) R
- e x1 [# t: `" E: _' E
1 @$ P3 w8 F) }8 E: n
[0 R3 E. L3 G- & ^, `7 N% t. G8 i+ Q4 S+ E: s" y
- 5 ~: y8 }4 i2 A7 U
: B: Z+ n6 W0 v, G- ; o( w7 f5 ?% f1 N! m) F4 O' I
4 z2 j- U. H9 s7 h& `- $ ^( I. B6 M0 g2 h$ ~0 t+ r7 q+ @
- ) c) W9 ~# [) c" D! C: g
- 3 W+ f" N7 B1 m! X
3 V5 K% h' Z0 m- ! o$ ~+ ^7 ^3 V3 ?. R& N& u
4 b# L; f" ^( X9 L Q9 q- 0 @5 J# C0 f) H# _
0 L6 Q1 A8 V" g- 5 l6 g( w2 ^; R7 r8 Z5 M4 _
# M: Y% I' T1 Q( Z3 z
! p# t) x6 X: M) O' ?1 O- $ a( B$ g$ h" v7 j, H6 s0 D! m/ g
- ; q( \+ h- d( e; m
" ~) h1 H; X. i- q6 Y0 e3 b! M- + H5 m c( w, p+ ]
- ( O% u7 Q' B7 k( P9 j& r* v+ x. h
8 X) i' Y5 Q" \3 w% Z3 F$ X
! f% Z |9 }# \" W' J
& F) d1 }2 A% k/ }1 }- B
) j2 x# R4 ?$ c& K- / I5 X. o' j7 g* u4 g# c
+ S2 A6 S+ g& D
' @- v$ k, s* Q: a/ }1 q
7 v5 l* L& h* i$ c5 F1 b% P
& I: |: d! t; {9 [ R; c2 x! P; O0 P8 q; i- X. Q; Z! u; Q# y9 z
#例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))
/ ~2 j3 C3 i' D- K' D0 [
: w A$ M, f5 z2 D$ o例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) $ U0 C; p% X+ l# n
- ' Y" m! @6 h! t) b
) ?- K0 h" g( z$ X( z8 S! f
5 b7 _# L( D; B! _- / U7 I" W# K* |# m! @
% z, ]( V/ C9 b$ t; H; }7 u1 M
: T6 w8 F2 ? E1 f" N4 Z# c
5 M' _% g; I3 d; c. b1 ] O$ K
: `7 |5 q% N. D! X5 Q$ A# U8 \( ^
+ ^8 `% r! y$ m
' z$ x% \. \ ~: M' i* E- ; a9 o0 [. b: a. j
- & I& X8 s; I/ c3 [4 _( C+ a
- / q( |. } O: c- [
- - s. P9 M9 _+ f" R+ h2 [2 ]. W) r
- ; k1 w! W2 u: {" _; ]5 |" V
1 G& E0 W1 w5 ?1 A4 X3 T- 3 \- ]& d8 k/ q* i0 |3 K
* E7 l( h9 _- {2 ?+ K- 7 k4 }! D0 @0 C$ g' w
" l. M0 S( o* ^, V v; b
; `" [; ~: n/ D: ~; e
! W# E/ g( P2 t" z
/ ?1 F: R- F5 A) f- u! V8 K- K- g6 E2 Q, ~4 J
- - N/ p- q9 z. ]$ E+ X% T9 I+ q
. b$ b- t6 N u) o4 _# G* _& }' S- ! Y* P i2 K" W2 d# Q! B+ j$ o! d8 h7 _
- : [5 ~$ z; O$ L* H1 W7 d9 f1 \' S0 L O2 {
- : y6 D* {8 H3 Z
! `: b& t' n/ g: T/ D: j( N- " c% t; a. O6 p6 S: e8 N7 ?: v1 o
4 f% d( t6 ~ r# C9 i9 V
" n. \2 r; i% e. t
$ G- F" M1 o% t8 J3 h/ v' ?& J! S
& ~0 \% z. z. p$ T; \3 m" M2 U: [
7 y* {" s) @& m ? E. ]
+ [# m$ n$ c! N! L& `3 z) R
( p8 ^0 U! w4 B- ! D7 i8 g' j6 p! u" R* B5 G
. d+ r& v9 x; Q7 Z4 ~- S
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))
1 S3 U/ W4 ~, t, E" ^ * M/ {0 K8 T' [
. x5 T; o& T* N颜色表:
3 C8 O( S% a0 b. Z8 b: d/ s0 e) ~8 _
8 K0 Y# V$ p& y2 @ |