|
气象数据可视化主要依靠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("···") 1 d8 H' Y2 ^! _4 h b# }
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- - q/ t: C% x$ \: I- M
- . k: O2 \5 _4 ]- j0 f# F$ P
! T S- J7 [5 R7 l- ! [: ]) ?0 t5 A( `" x& U
% b8 i1 C: k. U- " n- a# K8 L8 ?( Z
- 5 K- Y( C4 s3 i$ i& ^. u
- 0 x h+ u" A! M4 P) p& r1 ]9 W
- 5 Q5 T: b2 [0 U7 O' o$ k
- . n3 D6 ~" ]- L
+ b! _0 V5 s# E5 ^
8 e" s+ T; g+ }% d, U/ g- P- X
4 |: i7 N3 X4 R5 ^5 C7 x
- h, J7 \% X W0 ]- $ ]" X5 G2 u6 q. R: y
- # p% F5 |5 X; Q/ K$ t6 Y
- , R$ t6 f4 W' s0 [, k: c
* g: F$ g9 D8 ?7 X; W
& ~ T7 b$ V0 I# m. `. N e- " s2 X# k' x1 }+ W1 Z/ I
- ) e+ g8 D/ v; q
- 4 b' Z0 I$ `# K+ S5 ~
" ^4 h3 {* n' |+ a5 l
: @. K' x/ n$ k4 R( u- 5 R8 i4 O/ K7 ?& w0 L' U6 z
2 \5 v+ L6 X+ s2 f
#绘制中国区域基本地图轮廓,包含省界#引库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")
, K, `1 c9 G9 `: r3 } ' q$ }0 a% R) p( W
9 x0 r0 G, ]: V9 J3 H, R& {6 j
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- k: e. }$ B2 P S' L
- ! n4 ]% q. V1 u' x" Q% \% I
6 A" L `& x) N9 X% n- " g" R: x @" P3 _+ T( D) M4 I7 P
5 k6 g. `( g9 Y
$ n* X$ q3 l) h% a) Y" i2 r1 V- 9 S4 ?$ `' h! |( ~3 r8 b
% j# [+ u6 P# v$ j" B8 U: r2 M+ Y
6 y, i; L* @+ y2 b# R, H- ! x/ v. `% ~* m6 `" H' q
# ~" s3 d$ D/ L0 w
$ Z& u/ Z. a) L4 q
- `3 j4 m5 o" \9 [, J- 5 j5 K9 S8 m$ S) H9 Z& h4 h
6 P3 M. ^/ S' V- c8 H6 V. N: y6 I- % M: u- {/ T) U
/ l; N& s0 b) G3 q) T- 9 G2 J) ?5 w) C Y
- 6 ^# ]/ r& e: P) H
* l7 z, ^6 ?4 g" S) g% V. l& |
#绘制中国地图,并标记各省会城市名#引库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. z2 g; ^* Y7 Y: Z& I; S* } , v% o( G, p0 }( W) i+ [$ u: d; ?. ?
G: e, r* B( X; ]例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ X, J K( q6 [. g8 t8 d
3 G, }' \: p$ a' Q$ {
% W: H8 | ?4 A2 H. q- 0 t1 n; B7 a+ z8 V$ F
9 @4 k# w2 D" ~
9 ]4 e4 A' }$ q* j9 S6 |- 5 T7 D5 X; T2 ^; G( l" @4 J0 u; q, K
- : t9 R: U2 `6 \- q* c, J3 w% q
' j" |# f3 r" Q- l: T
) ` Z' }% h3 M, k6 w8 l
* f' R# J1 D+ ?1 Y p7 N$ {1 ?9 [, j2 d
5 F* K6 H# z! U8 F& Y- c6 Y* F2 C- # Q/ ^: @; ~$ R! T' c r6 A: h
- : i- i8 w! s' p, T6 E$ ^" n
- 3 z, a; v/ N2 j- T% u7 e' S
- & X$ T" j5 y$ B, B& C+ U4 o% f- [
8 B3 @: b9 z. @9 { w
/ q5 O3 `" r: S+ n3 L# R! t
; d# X' g6 S, M7 b- U9 e. t0 G
" L" X3 L$ w+ ?& x2 x% A1 g0 A' {
# S3 g' U c" b8 r6 {8 p! q8 z
# g( U5 e3 f- p/ h. y: \
8 I3 L( g/ A1 |( z
5 K7 X& l! K* i7 s* {7 F R; k0 k' n
$ l- O/ U. X% N+ N9 e& e" e- 6 O8 x: k0 u0 ^ G4 ]3 M& b
: h: s8 X+ y+ N+ X) _' q: b+ q
+ y; X, ?, ]4 l$ F: W) ^4 I+ K8 p
2 ^* b7 O4 R$ P' L/ E9 s( e3 E
& B5 W( m- I8 N7 _, O
$ k* ~, g6 [3 S+ I. I5 S$ k, ~- + u0 o) G' o d6 B
5 C0 R- t) H# @% Q9 ]% u- * k% O6 K! z, H4 G2 f. \) A
8 H$ \$ U$ e( E7 v, \& l5 A- ; C# j7 |6 b4 b# F- V: w
& K- ^) D( v1 }/ S( j2 _
- |+ d5 O, @ X0 \) d5 z
' }: X! Q, l% N7 n, V& v
% f" I5 ~% N5 N. X; u! I- ! {0 G! p( f/ m6 d- H5 `
- & T9 Z. [( r9 I E
- ' Y5 k1 X' X( N) z$ L
0 N* T C# N5 ^: ]
, Y, a* D: e9 ~% Z# X8 r" o; P( x7 a
- ) f& |. E& G% \7 E/ f
% S! L1 c2 h1 Y: o
% u2 ?- Z, k& f: ~3 m- # a( R0 D- ^. a# y7 p6 Q5 `
: b) L# d- t; n
: d6 k3 a0 i7 L9 n$ }9 d2 f2 T- ] F
$ N2 S5 X, r! |4 _
##绘制有海岸线的中国地图#引库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()" l5 L" B. _- b1 Q6 P% w6 j/ Z
4 ^; }3 ~7 E0 f5 t+ w4 n
6 X8 H% p6 j: ?6 E9 R& Y例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 ]8 ?$ Z) D' p/ F" I- . D3 P4 G3 \; O3 J% K
6 w) }8 n' N0 W
3 i, T6 f; K9 b9 x, { g
5 \/ n% v8 m) K) k) ?
6 t% `( W, q2 n% [) M
N: `: q% U0 @4 i6 r3 s
8 `2 ]3 n$ Q2 Z g$ \9 P
0 ^6 |3 I& J4 W9 z% L* ~- ' R# ^; d; ]" `
( r, O9 R& _0 h4 M& r9 e' s+ \6 {- : p. k3 g" \3 b- g5 Q7 p% U
- " g+ A* g! {* [5 ^! K3 B! G( s
9 J+ o3 [/ n3 @ v8 |2 |0 t6 N- 1 @! F3 }& L! c( `
?: n; `# Z" k' l# F! f" ?9 [- : ]# f$ Y3 z b; k+ g9 u. }* j
9 U4 v6 J4 c9 f, x3 A) W s& }
2 u: P# S, C/ b9 U5 h- 3 P( t3 e+ v, t3 W
- 6 M0 h+ V# l6 b; R6 j/ Q0 Y9 q
- 8 H! x8 c1 V& i5 K( S' [
- ! D" E& a; h3 C9 f( J2 Y
- * r2 R% x7 A+ v2 G- E
- 5 O0 L1 k9 c, w. d- A% v! @
- 8 M, W l$ Q0 C" g# a+ v
- V1 ^/ S/ A& m* ?+ A
- ' _% Y- @7 K% V- j! `) P( J
- : F3 J* n4 k3 x
- " ~' s; l5 ]9 c) Y0 J
- + a. J( K4 L9 v5 J3 z! [2 P6 {
6 f( O$ D+ p4 b5 `- 3 q" {( B" y$ i7 ]! q9 l* `8 c) a
- / @0 V) ]- @! H/ S' p# @3 B1 v, Q
: a5 V2 @7 b' k3 H5 d1 F$ u
7 u* F- J+ z9 C+ i, k- 8 B' B/ U1 m8 j# B0 R _
& H" l7 V9 Y M, ~1 A
) [6 _0 H b; J. [- 4 l( f. |) s7 V* J) V% g9 d
- - C# b, l# f8 ~' n9 v" S( \
7 S0 I2 T' ^) ~2 {1 g" S% | B7 I5 F) b7 \! J& M$ Y$ f3 \
#例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))
* D+ t6 v# w) K9 y5 C5 u2 V" w9 Y
: S, X4 O4 S3 K例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
7 ~3 J2 ]" n) P0 u- 1 s) ]% _. Y- M: l7 R# W, l/ G
# l! x2 k8 ^) m3 D7 ?/ q6 \
! [* F0 e7 `) U! c& X; e H- , J1 B! P% K0 H; P9 M
: Q% s' _, [ w, O! n" p+ d
0 [7 a: {1 [: T- 9 w; \$ t7 e4 ^/ B8 t
- 4 P. ] X) Z8 i1 @. M3 D7 f* o
`- G, F* a% m% Z3 m% b
& C, j( S7 ^* U- 8 L5 O4 C7 {+ a [
$ E3 B3 K0 c U! n- 0 M+ F( v4 ~/ P; U
- 0 q0 W+ V# X8 M" w9 g' l; m& _
2 J( q5 p2 q/ N5 g3 \7 R/ r- * d4 W- p* }/ U& n" x0 i, Y
7 J2 L6 V. U0 h; z, ~# H2 T
/ ~; `/ Z" t. O1 [+ L: \- 7 S" P0 H* K0 t. h
- : b9 e' v6 Q2 I* g1 R* V# T8 {
- ( E/ l) s0 u' G- t
- - r5 C0 `& [6 U- q6 f/ H
- 5 e0 U& b- T5 {4 E# N' p0 Y
- 0 O4 L6 C, o* Y/ q* X8 ~+ j
- ' q4 c! e! Z; \$ L9 W9 h" h
( u, k0 J: j% d) C6 ~: ~
3 f3 r# \0 Z3 D* ^1 c- - H$ M- F% J2 n
- 8 ~; o- y6 s9 `* j) T& f4 v3 W) R
- * i+ [% `- c( r' ^. J
* }% C! r! U! j6 H' c
) }; Z1 L4 r& ~! J
- \6 W; N; T7 I& i" T3 ]
4 Z; h% I; ^! q& r, O- & F/ D" F% Q3 Z- o
6 F5 s( A0 J, L2 O' u l- 8 K6 Y) W1 e3 e' B! r
- 1 T* Z2 T" ] [( N5 ~
5 ]4 w9 l, b) Z: {' M/ d r* M* W1 E: [! D4 R- 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))
' H* J1 Q3 Q# B/ ^ , S l/ U6 f& {7 J8 t6 f
0 t* T- P- e x# w- Y0 N
颜色表:
$ `' ~* \( A6 Y3 |& f$ @ y0 R- \; a% ~2 d
|