|
气象数据可视化主要依靠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("···")
2 X4 ^* P5 r( q" m5 Q/ i# A0 p
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- % N, l( _6 X) G: O
- . {2 c# j- P5 ~0 c
9 [5 @% D9 T# g8 w
* x0 k! ^, H5 b& H! i( |5 i
' H9 u$ b* }1 h$ i+ J3 O$ k- & N8 C1 [5 `2 z- C" g6 F L- ^/ v
4 M `" \- q" J2 O8 d7 E, k
* X, b! T ]/ e' _& {/ q( D
; W; G, }4 q2 S- - A* w6 d2 k$ X8 `& r
- 6 P* b0 u' k4 q( o, `; v& ~' V
/ d4 Y$ s( @, y: L/ z- $ K, j% K/ X% k* j0 l( y
! Q7 ?9 l6 {; r7 n; V
, Z8 t& @8 p7 P5 o2 T4 M
" K- N' L" K$ N$ N
5 S; h! z) H2 U4 d: H+ A
) h: E. e9 @7 K3 \# {- h0 S
! ^) l; M5 C3 S3 r8 A' Y1 X5 I- ' V) e+ X: G. E' X
- S" }& d1 L' t9 f0 ^
3 N' r+ G2 q! ~/ z6 O6 V. E3 v6 { G- * j m3 Y9 ~9 C S" K
$ R2 v9 o/ M% Q. r3 m
; s4 G. b/ K+ f& A: \% Y1 M5 r% Q$ u8 Q0 k2 T$ s. Y- e b9 i0 X
#绘制中国区域基本地图轮廓,包含省界#引库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"). `$ w% d! o9 Z/ C" \
* s* K* ~8 s1 h& |% ^
6 @+ h* q$ M1 w6 g* w例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 E3 b0 t5 v, z3 C( W0 o
" r2 A' H. b/ `. L! q
, g( {7 z% m; R- 0 N( R' L+ z% a8 Y! H4 m
$ W3 a% D0 l5 H, b& F' K
0 N" L; [" z6 Y, R
9 b0 X9 M3 s# z4 w
$ Q' W; E3 {! I5 D, T- L& d, W
$ k& d9 \* o* ]. S0 W9 R( d7 ~- A/ p8 z
; q8 Z" s4 g5 T8 D( N2 ]. c
& L, ?# k, D% Z) z1 U- 3 X& l! `* x* h, H& w- J- o
s! e: `' P+ I8 W( r; T0 G* X9 U5 l
3 F/ [; f& Y! V* K0 g# M5 I' f- ( V ?4 [. g$ u2 c
- 1 d' H6 V8 S5 v8 K0 f; k4 I" |
- 6 k, n3 t- P* B3 {, x
- 7 b$ W9 F! \! R! t4 L
1 o7 [6 l: p( A9 z* I+ k) s3 V
( l: s8 n, G3 r+ ^4 I8 J4 q" |
#绘制中国地图,并标记各省会城市名#引库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")" }/ O7 I: O) c. f5 l# K1 ]: o) B" K7 t
3 w+ G+ z: b- B) `0 `$ b
, Z7 k4 ~- A. C1 L1 q' W$ E
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( S. Z6 j& j) e##绘制有海岸线的中国地图#引库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()- S0 s( @: ?8 t4 ^4 [# t
/ v% e8 `( N) }% k) o) a
. W" H' W/ F8 ~例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( q2 A# v: j( }* W9 x
. \: [# v8 t) |, B5 }! p! n( m- 0 P3 g$ y% i& J) e5 S
- 0 c% E! \' w" Z/ b" y7 H% p
- - w3 K* I& O" }8 K$ f
1 N( L- T2 ], x1 R1 y; Q0 r- M" C$ l
; S4 m4 B" x9 x# t
- F D1 q6 u t: _- ( B3 B( s8 a1 i. w5 F$ f% Y
0 O" d; Q" Y s* ^( B- $ `, K3 M, u( j/ O; K; u; n4 w
- 6 z" W! g( i! U. e2 i
- ! P' k' p- L* D& N6 ^ J$ Q" B1 ^; Q
: i3 k+ M' w ?
: E. |8 c) U8 ^, ], d& N5 k8 [
/ W: v* w+ g$ t B; M$ Y5 p1 k- I
# X* J- b* @0 k
4 _/ v0 j- _9 Y6 J1 F- ; _+ y2 E; ?3 ~3 Q4 f4 v6 K+ k0 Z6 G
T" Q$ \2 ?) Q1 u! S- , Z+ t7 l9 q& m2 y0 C" ?
- : K0 a. b- f4 o4 y$ H0 `
- 3 B+ \( O) t# l( \: H1 {$ H$ I
k0 V. J; I: {5 x
' Z- A1 j7 C5 D$ Q. B) E
7 [) ?: p/ [& `) o6 J
. N2 `4 s% N( d6 t8 ?
/ i: U8 j5 W6 ^1 E
, l: i6 _; e( a; V- ' y$ o' B- D K$ ~
- ) g- j7 n0 z* U0 x& i* X7 A5 _' v
" K$ N& h( b5 Q
# T3 F; L' L! t
! i. t/ ~: o9 G6 V5 b( m
: C1 D: D9 F: |- - v- {5 R" C. g2 e
- ' { W+ |1 _" s+ _
- 8 g# s- C1 }# F
- - ] N& }: ^! V5 H* e
( B- f# L1 n% i I( C
2 E1 y4 [/ {3 {5 V6 Z" O4 H- % |& v/ a* O1 w' R
' H% S% H" `9 ~( u Q% d8 s
#例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))
, P I+ f q5 e5 [! u 3 R% T9 h' R U& d1 A
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) + N9 Q$ ]% e. K2 R0 }% Y" N
2 X) p/ T* M' }: `
" w: k- D+ Y' ^3 L7 Q6 p- 6 X) A6 o- ]5 ^2 ]4 z* W8 t. [, X
- " U1 d4 m# O5 X* K
0 `( U% g ~7 a/ `; a( Q9 A- 0 X! _) s6 m( ?; t
- 2 M9 c# N; y, ^- z
! M0 c( d$ a6 N( A9 `
2 z* g9 T, g) \) T1 y5 e' \5 s- ' N0 u4 C- R0 G) O) @$ _6 U
: {, D Y4 _1 h! z |! E- - k2 S; B8 Y; R0 S
- + t: G3 b9 h/ t
- & ~, R* b- T0 Y
- 0 G3 ]$ e% s/ G a
; U/ O% D+ Z1 H. ^- . c& t" o$ f4 R& o. I( y
' K; s" K. Y' `% ~
) c8 D3 Y% n; x1 o
, W6 Y% @4 H4 u% s5 _
2 `5 s4 t& {- \8 w7 s9 o6 l- , p8 Z* `3 c# X( I% B5 N
- 4 L2 R, P4 F8 H$ f1 ~4 ^
- 1 h7 c4 ]1 M. G! V
- ! z2 i% M- }1 S( X% p
# i* i- t1 N: d. X3 y
9 v% o9 M7 O, z( @1 `- ; U" g0 k3 k, b, y. t
- 0 e% {6 \. G& s
( R( y, |" B. F! w7 {" L8 E. c- 3 r5 {' ~% V \ M! D$ K
+ d7 v7 t l) E& o- 6 @ e/ Y7 P" x0 H/ X
- 0 J. A4 F+ [/ B2 r
- 4 \+ g: u9 V( F( `
. V. [( g; ]& V) [( L! F: {
% x9 R7 {1 t4 H4 M. D
' p) E+ k+ ?( }) U: F! Y: ^- , A! f5 q" I8 D8 J4 H' I
8 R7 b. [3 S3 J9 w
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))5 Q* x5 M- X8 S1 T; J# ?
: Q9 A( ?# z* k5 W! T! ^% V5 x9 Y% ?7 {8 R, a* ?
颜色表:
# ~2 K b! ~7 U B5 Z% M
* C; v$ Q3 x/ {9 _/ N |