|
气象数据可视化主要依靠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("···")
' ~3 c: f8 [# B( q: F
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ Z# Z/ g9 M7 F' h4 \# E" {7 ^- + [6 R1 l/ O) [ v$ `: o% M! N
& A% |2 K0 F' l
3 p) Z' Z5 `. Z- ; L" ?* a" |: `# |8 n
/ N% J$ y' I* F+ W8 x4 g, c2 K+ s- 0 U; f; [* J+ f W7 k
- A' P1 k! t; I& I
0 |6 }7 d$ ], G2 c; v) N: p
0 D4 }2 z! U2 G, v5 @. k" ?' ~- ' `! I8 l* y4 M' s: j% W
- & D$ N2 R/ w) e
- , }5 h' D S* s% w1 g0 ^5 j$ E
- 9 m# U' x4 _" J2 P& G% ]# s- J
- ; H, h2 ]! n6 k4 M8 {5 |
- ; s- `' o, |- p
9 [) g2 p, \0 V
/ v, Q" W$ ^8 I" _4 o' ]" U- 2 [0 X5 M, N7 n, l! {7 v- D ]
- 8 i. v' k& M9 T1 P/ d
- $ J) Z/ X3 o" z+ A# H, |9 z- @; M
/ a8 r0 @2 ^! j( u
, C& }/ [) n: R& ]/ v% F& ?- 0 R& p! V' r, W. W
4 @$ p# k! U, I" u
+ s+ y! O( i- q9 M$ I6 {5 m9 A
#绘制中国区域基本地图轮廓,包含省界#引库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")
; b1 R: }- s+ Q3 p8 c' w% K( G( b; d 5 R1 q8 T! c: ~4 m5 D4 z
/ x4 W' M) J4 ]% G
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ v! B; [/ Z% O. T6 Q2 k+ g0 J- ]8 H7 W$ m: ]' ~/ k
- 1 B, s/ t' B, l
+ {; Z$ w, K0 ?3 M% i' K
( s g" G% M; \) b* [& e7 E
( Q, c0 t) ~ ^" w- 4 E8 e8 ?% b# C; d
- ( T3 @! K1 K% l+ B
1 W3 J9 N2 b( ^1 g8 W e- # l7 N" K6 S, l5 Z o% B( X F
- $ n4 W' _: G8 E8 w( B& `8 R
) h6 B0 `$ J0 c* i4 C( C
5 B4 z) r) j* m/ v8 v
s- p9 j3 t8 x C
+ [4 |" a* P5 i* Y B' L- # c! r* R( f z
* r! c$ p' Q; U0 z+ [- 1 v' U0 o- H n5 N! K7 K: o( a
- I1 B7 L0 d1 P) y
+ q' e9 b7 r: d9 i5 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")+ ~) Y- \# l# @0 q+ m8 l" V8 o
% e2 ^0 `. u0 v. c
- T# k; t1 v& u) l( c
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 V% N% @& G& _& I/ {, w3 ^ ~
- & ?$ Y+ D+ o `2 C
4 e. V* {0 k; N+ S( `3 H
* Z( C- {1 C4 V% F6 i4 c- 8 d+ {, v; M% r; `) _
- 0 B8 l d* |- X
- / C1 C+ M/ N3 x& H
) k( J, M" T, |0 Q" r/ ]
/ W* K1 n1 X- x
9 L- T0 r3 Y% S- d/ w9 e- : ?( Z+ Z+ E5 I( f' p% ~
* G/ {2 F# C2 S5 s) H
% \% i& g8 o" [: b- ! C0 Y; ?2 \/ v& V) x# D
- ~& T8 w" ^. }- x" B
- . h- k2 L5 y0 Z; j$ G: v
- : I. F4 `7 F1 m- x$ }
- 9 j O3 U5 b' p" g' s3 f4 b' u+ n0 N
, O, f( v4 M |/ M- 9 x& J* L' N. b& j1 P% W
- 7 ?6 B: v! A# G# o$ T2 O
1 o3 I9 x3 u8 C9 Z# A- 0 s7 Z/ R* O/ y" r8 u/ p# J0 e
) h' P6 z' w2 H7 I3 J0 k; T- x2 V/ Q) i7 D! `
' m+ M( S' V9 R; k. T2 p! f# D+ s
0 [- Q' H# s o7 P# ^' v2 K
! P7 Y9 a3 C7 t) g
) O0 a; T4 R0 c" W- w2 X* T
+ G9 g$ T1 Q1 D$ W% \" y7 z- 5 p% n7 t. c7 Y+ U3 T
- % G4 x4 }- f5 q
- / ?1 |, t7 L/ S+ }! x
' B0 ` ? M2 v; a$ r; T
" `" u) |. r4 v- 8 ?# s9 C0 R- ]$ W7 }
- / c5 o* ~, Y" \/ Y# s% `- D
- 9 M4 v4 l$ h2 W' H' y3 u
z: E2 Y/ z* z2 K- 0 U. J: }, { C* b' _
- # Q) _+ [ q) [# S' f2 O& J
% w5 u0 `5 [; A6 r! U& g6 f
- T) D1 K1 s ]- a3 e& o! Z5 |
0 \6 m, y% ~ N1 [0 r2 T
( e2 `4 C$ E/ V% H
5 W/ a6 ?: z$ v0 { - ! Y& v/ z: A3 b& z) t4 }
4 D7 f! S4 m" g; Y$ _" o
8 ], ?; U2 z c, P' N- ) I7 ?/ \3 |* o1 K5 P7 L8 ]
' I8 G! G% C- i$ R& Z$ N# q, {
+ p P2 ?6 m: N* n8 A6 y5 z5 j. l
##绘制有海岸线的中国地图#引库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()
- G* B5 p" Y# `6 N5 R
. @' u' \4 `, h5 v3 H
( P8 I" [0 @1 W& u例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
3 `9 N4 V" X: r) M& q- + x/ K( ]7 F9 O i* k" c! I) `
- # f; e# W. ~- ?6 l; ?
( Y% {4 y& \7 V# S2 M- # `8 ^( e# W2 l1 P! W
2 c0 u3 V8 d+ ]8 \- ) S5 D; K# a# R+ M: E, [" [
% G* H& i- I* q7 \* l/ c- r) I9 {, _
+ M8 @% j/ j' c5 r% t- ; S' o: @ r: }/ E2 _8 w
- : B u+ G/ r3 m5 y G5 R
6 t/ W- A* T, z7 J- 0 ~7 ]) R, l# M
- * T+ @" B' J2 v, J9 ?8 i% V; q
/ \5 M0 J8 ~, F% R8 Q) P1 b- 8 F. C8 V8 ?$ ~& ^0 b* O# W0 _1 X
! R; u5 u- g$ o) o- 1 f: v7 R5 [( i+ U3 z' }
9 d1 \7 X. ^; J9 l- 5 s i1 P8 \; b, g6 C. c, Z
- `% D2 f6 l( X1 e
- 9 x- Z2 J/ j+ M: v2 T
) u$ k7 h, `4 }0 G" ~
% c$ g- H; H: E! e( G- ; F7 N7 E" u1 ]; X! G7 ^! h
6 Z7 h$ ]7 A: Y9 x, S, t5 T/ ]- . `! ]- j: ?( z7 D, k f1 D- G
9 K0 l; b D5 T f" }2 D
5 J+ ]( I$ y: U6 U9 K& l3 t; R- * [4 p5 L/ o# X, C& b4 m y0 a* |
- ) F1 _9 ^7 l. x. _& @2 I' d
. @1 l( G# {3 ?% O& B; ~4 u5 W9 c# d, g- $ n# m0 N: e+ e7 f, Q* k
- ) Q$ |- {# L% v( m
4 U# d5 s* F! B5 }, T2 {& N
8 K. Y [# }% U% V& C/ ?7 Q$ u: J5 p
+ B( H, G! x" c m% D$ {/ l- 8 W9 D" {' T1 _4 i8 C
; Q. \; T2 F4 `% F5 d$ c
/ }5 Q3 | L) T; l+ ?9 [
# x( \- w! ^/ J' L! k, l- V- ' A' z; c5 i: s" A4 O
& D" n" o6 } j( b" Y5 \
#例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))
- M# N) v2 j4 P6 p7 l" m
E2 s* G/ r/ a7 F: I9 F8 T例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) 4 ^" R! p' p1 @ Q% T8 X% R$ v& J0 ^
- 4 o. N5 G* H; E+ ?& F9 `+ L
|0 s$ G1 i3 I2 I* ]( A- . B1 Y) H9 ]. x9 J3 Z' B1 x
- 3 z8 Q. ]1 H9 K
- " ?/ l* f! Z! A: W7 F0 ?
- : e6 ^8 m* S' p* Z$ R
- 1 `, ?( m7 p {6 U: \
% x, G& H% O$ { Z7 z ^
* Y5 E/ C. ^2 N1 O) y. t% d- # w- k5 n. H" k" l
- 8 o) p( V& \* z7 c5 O( t9 g0 _4 d
- & z& ~6 `# w# X0 \; Y; w5 F
" |1 j5 {" S- |- t2 W0 T1 s! f- " K1 g. }- S% L8 o4 s+ f# V
8 N) p3 U. l9 `. N" [1 c6 {- , s ? t- B2 h4 X% G* l/ w
( w! g) B# i2 ]. z2 c
9 E( P* @9 }2 ]5 h' ^! t. g. ~- 1 R" ] [& {5 J, B1 ?1 R- C- Y" r! y
; r- T. ]- P" ]
/ o* ^/ Q! w3 k- j; P& P* A" s) q! Y$ Y/ [
/ ]% z' j9 ^# R% C% \
; ~' F- [. @& o- 1 f4 ^( K5 X, H8 o4 }; G, X
- # a8 V! q' X0 a$ |4 H# M9 s% H1 d) M
- , G+ [ ]4 h* a" S# t
& ?: p' J( Q/ k( c0 E+ t9 @/ V
8 J* K9 }7 b, ]$ G! n& [
7 |3 x! U: Z) c& i3 m4 X, q
0 U0 c$ ~) N1 q' H. D; U
# y) ~4 l2 s) y/ K5 o# b
8 O, Y# o. i2 p! Z3 o5 s% f8 y- / `: y* k/ H' C0 g B N! I
- 7 e% {: ?! j5 B: D
- ; b! n3 l) l3 \+ Z5 `- [5 v0 d
$ I. j$ F6 R8 Q& S6 b
. e' v. E4 O# o9 r( V+ w- ! _" s" T! I. m* X6 G4 y2 d
3 B0 r9 [4 Q% `$ ^7 k# a
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))
; f- P# |* g L" m
# R+ W5 n) h& Z! {0 }3 o$ I6 l5 z* S$ g
颜色表:
) U& v3 g# Q s6 y/ T* \
9 H1 M5 A& \1 y& u8 D |