|
气象数据可视化主要依靠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 x. @3 [5 L/ ^2 I" f; ~( R3 c9 s
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, e9 ^2 U; |, @/ e% P( R2 K: h- 8 Z! f. Y$ L1 y G) w/ D
: C7 e+ W7 i7 H( x. ~# w
' r# E0 c6 c8 z- : N3 R% p' D2 N/ @' G# t: Y( K
v" B/ V+ G( O: h0 g& u7 e8 O9 ?- " i2 H8 w0 Q' Q0 B4 t( b' _, }
, H' o" }4 ]% t- 1 d% g' i* P' D, l! [" F' U
. \0 K, q' K3 W* Z }0 o
! R# }; o* K, Z$ s( Z( |8 n9 C( k9 T
. d4 d& e$ Y* U3 D- ! G# ?7 x0 q( n* Q
- R3 r1 V5 u3 s/ r0 H
6 B- `0 V; Y4 @" `3 t- " U* A: c h3 ?8 c; v$ S
- 9 X: u, ]' A* W3 j0 X. k
- & L+ A; w& X. {: J E: O
2 @! k6 N+ e& `( X7 J
( F( G- n. }2 ], v* g/ }
3 T9 R$ A# o: W+ c* d) B( g4 x( N! }
* |3 G/ k n% F# l7 n
8 N5 q& B7 w( l8 R. P! S- + c% @5 y3 ]4 m" j; \1 C
- 9 b4 q) b; s8 Y* N, ^8 y
! [. c/ @. L: X: g/ z6 x6 F; C3 ]# o7 \
#绘制中国区域基本地图轮廓,包含省界#引库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")0 J( }7 f2 E, u" S5 V' r
. V8 j9 i# _7 ] i* [: U# O
% h2 l: B& s* k
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 ]8 z% y7 Q5 J$ q% f5 i- & ?" W- P4 Z' J8 L
- " r4 W# Y; S3 ]
6 Z9 z5 \& T* l; ?1 J
% t5 K" x5 r5 h! y% ^- ; |3 f6 a. E& A9 |$ o
8 g- I. k' m y' H! r r. z
+ U) o4 y. _4 z+ M6 @4 _9 i( X8 ~- ~- 3 X8 {3 }3 d. J
- 8 o5 \, x& \3 e3 q2 p/ `) h
- 5 c: |# z7 `5 }6 L# s* y1 c9 t0 X
' A" } `: O( G4 l
4 B0 }% H4 _2 M" j. U6 x- v# s
6 p% f8 N8 v( E: |% a, m: W3 D7 c; s- : l( e5 W S8 `6 w- Z
- 8 l0 V) q5 i3 M
- $ G- E( z1 ~. ^2 i$ U' g
* G% h- P/ C" c' c- R- $ h2 n7 x/ O: e) r7 Q+ c
7 n" O( G( Q4 h$ W5 n* Q& E0 c
#绘制中国地图,并标记各省会城市名#引库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")
& m0 c; o! Y0 l & `/ ^% s0 S3 s- k* @( h" ~3 F
7 a; a2 r0 `" @8 `6 j例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
0 s5 g) b; ]7 k, J' S3 S& k! g
##绘制有海岸线的中国地图#引库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()
7 { l; ]% O0 L% _( [+ |& r7 S9 F 8 \$ M1 T e5 _/ V
" I# o5 z7 L, I$ l. S7 X/ ?例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( x/ ?3 D, [" R8 D3 L
- 9 N A! g( R5 l; A6 x: \: K
- 3 i; A4 s" C) H2 @# I- g ]3 Q
- 8 t3 e% l4 S: A9 ~, w
- 2 m9 A: W" K. @
- 4 |0 @9 K5 U1 z1 E6 n l
- g W" G" i& A$ h; f' q
" h z% t1 r7 W4 B0 O- 5 M: H5 V5 z4 H
8 B" j3 i/ Q7 m0 i- $ F8 V4 p( h- c% W4 ^ l# O
- ' ], i, |# H; g7 t/ U& h, b5 @
- 7 K3 f, S* ] v0 f" X1 N
" X. z! p$ b1 z* h6 e
2 A5 J: `1 R; r) t9 P0 z- 3 ?5 k# I) j( h6 w
: {! d# b* |7 r- . `( I7 K9 I/ {% F
) `# X* A6 y7 Y- 0 K7 b8 b( T4 \' a- @" {8 {* }, a }
- 1 Z0 Q: B9 w( S0 I; Q
- ; P: E' M2 D+ C, ~ U) q& a
- ( {7 l2 F; H4 |
: X0 q/ S- L/ f% r* S" H1 c5 U
1 Y! x; d, V* O& y% o- z) L; v: ? l: K3 s3 ~, T5 ]" U; X
4 P& s _$ P1 W4 ?- + m4 [$ A# {3 G8 F, O: ~/ P# s
3 a N& `6 d7 U% [( \* G- ( G9 K$ [# }- x6 k
- & w8 i: N" h4 p) b$ A& n( k5 N2 ]7 [
7 k4 s" K; U) S; C1 p/ c2 n
% I2 ?, u5 v% q8 \
0 N+ C* I6 b% C2 S* c5 M- " U) ^- x* S* w/ ?2 f n) O7 n/ p
2 c# }# a N; Q1 K$ q/ a0 @- # B% `+ v. H$ ?
6 y3 Q( y, O8 O. N- 7 M8 Q7 b1 a0 x+ P2 L; }( ?
6 b, C& c6 I) j* j& y" P8 y
2 z' s6 v: K) V/ y. B! ]- 1 }5 K- d0 H' {3 M! d. r
: I# c4 J: j! H7 A+ g# u o$ K
#例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))1 G, ^% l% l8 z! r. o3 L
$ D) m: ~, z$ P
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) 2 E8 _ q1 o+ U* p# O
- 5 O$ L" u3 c8 J0 k' I# q+ e
- / s, x2 Q1 o1 ~
- ( l/ v' E3 t9 _
+ L( Z q) b+ |" e$ P- q" A- 9 i% Z, D, K. \& Z
- $ f3 D, \# L2 i. u6 K
& T7 ?0 g$ \1 S' e! J3 @
" T1 J0 `$ t* Y! p. y9 J/ F5 r+ [3 M% E- ) p) |2 n4 }( y, c# b0 B% W
( F5 P! j- t, i2 p0 s" {+ q$ l+ W
" }$ D8 @; [& b3 _4 K! a2 @( J- 4 t; |$ T: a$ v# n& z
- % J I+ n% ^# c
! }: b, l, n8 E0 w1 O- }3 B2 q
5 D9 x9 r$ f1 ]$ F8 A- & Y. Z K$ x& s: j
- * I+ y) M# m% b/ Q5 P" S) D
1 N/ d0 O6 L; _, \- d6 M- 7 W$ q/ e5 O: G) |" `; g; Z2 r5 j
' R" ?) U! Z. k( ^: d
& M: Y! G- R8 f6 X2 q+ X- a
6 L! h7 s/ U# E7 }% U- " l- Z6 |0 r5 ?3 R$ e
: k" G4 r) P* Z1 Z, L: z- |/ f& y
* H; S3 R7 _$ q) v0 G
, g8 n* k1 Y& U& \7 u4 l) Q- " D z+ r1 z1 T$ {; A5 y3 @5 C
( w4 e: g0 G7 i9 ^2 d- & c) K K7 o ^( k* \. _5 P
- & {$ U7 r, ]) K4 ]& V
- 1 i: P# E3 J, _# }% U
- ) P' [4 ^6 U4 Y( R6 e' P' ?. O
- ! C' `$ C, [) u' ^4 X: N9 q
- / P( m' t4 N( ]' ?$ `$ ^# q( {
' ^+ n0 y8 g; j$ a0 h4 W
3 c0 q6 z9 p) `
# A' _" u. z! l* c" \- 7 C* i+ z$ _# k! n$ H9 G
- |0 \* M% y5 z- E( Z
3 y1 ^0 a/ ^# {! t. ~' 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))
) A* N/ L3 d1 R5 Y8 ^! K2 I
# r4 y; @0 ?8 r$ }' T! Z8 i
, h. e1 N1 ~9 W- H3 J6 Z颜色表:
' I' W' I: w% M' E$ c7 `, b5 o
+ n% I* O2 @+ x% V5 P( z |