|
气象数据可视化主要依靠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("···")
/ J7 h: N4 R6 M, @4 d7 {6 C$ S
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- x, ~. k7 s# Y5 C! F8 z- - j3 [3 B* ]3 f S! @# A- J
- - L9 X1 P2 y* `5 [4 g1 B
- & y# c0 O" N- d8 c0 [
% W7 ?- `2 y: p: H# h* R- 3 O+ }1 f f: K9 r; x s/ s
- . d$ Y4 \* n0 r& r* ^4 R
- - L- k, P1 [+ h
- . z/ s% }. a6 u0 A+ t. A. @
t7 N5 r% ^, q" V/ {4 x$ X" a- ( M- U3 H& k6 G) s" ^
: t5 \9 Y: ?" j7 _! m
8 q' x7 P6 T7 I1 w- 5 m: u' e2 g; r4 _' j" ?2 c
- 0 h2 Z& L$ N: ^- @0 R
- + B( n) j& w* A& m7 p
- d% q6 F% Z( z0 h1 P" c# \0 R4 b, q
2 ?0 ^3 {( v1 K5 T+ [9 N
8 E( n+ p5 r5 E2 |% w- $ D3 B) j" d( H& C
) }6 A# Q. m/ c+ j& p) k& _
, O$ V) S0 Y& |- ?
2 G) j% F: Q8 J9 ^. ^. \- 9 k5 H3 i8 F8 a4 }
- . X+ `) z; c) O& m( E, x- g* v( t
9 S6 g2 F3 q( P; q; M3 y3 A. D
#绘制中国区域基本地图轮廓,包含省界#引库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")
) c6 i# a( Z; u, `3 x' e $ a8 ]; K; _$ ? H# Y
# L" W% n; J7 T' F
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: @( c" F- b+ H- j4 Q, r1 n' |9 C9 _
, B2 z! {( N* |/ F9 O
/ t( k' l1 V6 T0 x
* {* b, D- ?) _- 6 w* `9 w$ A5 q+ G1 _' s) I" P
- " M; ?3 ]# p5 }$ Y4 k: g2 Q
0 _- `4 V! g6 J' Y* ]* L) w' |- 5 k. K0 L/ ]8 b6 t' D n( W5 o
: Z$ W# d: x4 E" v4 u2 Y7 A# d
$ Q3 `; J( J- C+ j# y& N4 ]3 W
9 P7 F. s9 l3 p/ R* N
# B( O( V$ t2 J
s4 X! r) a7 ?- u, ~. P
* {. }7 \. s1 `/ a3 H# b& I
5 t; ^( _ i: m/ U P+ h
5 y$ [5 l j! s" D6 _, T
" a0 Q- i$ M3 R" e: }) O" y( B5 S- , J. z6 f0 h* L$ ?* w
- 9 G) T3 c' K: u5 u" R6 i1 [9 ]
/ _4 c4 i2 H# ?3 M+ e/ j. R
#绘制中国地图,并标记各省会城市名#引库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")
5 }1 ~0 v" i9 C& { ; W$ C( w5 T" ?7 Q$ a- H* B
0 l: S( [* y1 w/ t7 c) s例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ t2 |* N8 K4 u2 P; G8 N+ 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(); \. W/ N" n" O: @, _2 @
% }$ Z: p; l! Z8 W% J3 k% [- X2 `
" `! f' L3 J) r7 m. l0 p% \9 f例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
/ a, P! o" s3 R# O
! M" c0 D$ }1 @
v2 T, p6 R: x8 V2 W- y
S, |: e" \- `! o9 @% M( s0 Q
2 u* |( E5 S3 }( P4 C* X/ X9 g
4 @* V. L( E; Z9 G8 X3 f! [
6 e# |; G- _( F4 \- % }# I' g" O! B; w* g2 C/ u
- & c+ f" Q0 h: X( U( a
8 V7 m4 A+ Q% S
# g$ Z8 ^# w4 [9 Z6 [3 K; e
, ?& }% F/ h* @6 ^/ Y6 ]/ [
% V& x ~" m& L& s- " o( O/ c" c) p% P' [3 ~
- 8 U, u/ o5 P; e% d$ k0 k
- 8 C4 H3 ^5 I6 O
5 O' f/ Z( C7 Z( n1 B. e, b- " I* z+ l, Q0 y
- 3 u5 X+ \* {+ ^3 d F; {9 I
# T7 v! A) }+ |5 x" \6 {% J
1 @3 p& T$ r0 i0 k, T8 `- 9 {( w2 s! [) R: |5 v4 ~
- ) Q: f2 B3 _7 V" W( w+ {4 O
- * Q2 o' b# h6 D3 C8 H' m4 z0 o
( K2 |4 x3 h8 ?1 D- ' \- d4 W4 t/ o5 J+ b( u
- ! p8 ~% v) D7 n; e
- & R$ ^% A5 b2 N+ t( P0 c
- 6 f: I9 _ E8 d/ ]
- ( _0 {% }/ w" ?8 {& ?" L
1 c- ^& c l @3 l9 c
1 J7 [! o' b2 r# _+ R8 D! o7 D3 k- 4 F% w. p! }& S, q* D, P
- - j# A: h% j& P3 I6 R2 N& M
- 0 h8 ~( K. |3 w( k" D/ m# ]* L4 }5 `: V
- 0 \# d9 r# J; p3 l5 [
/ }) @% {. r; J/ i" I
+ V7 U( _# y- k9 C1 `- _9 F9 B- e; M s' ^, B8 H; p0 G
8 f, F9 C$ q. W- U* ]- X
5 P9 q; ]$ Z. z; ~$ R- ! G7 H5 S5 m! R+ \
- P0 G/ w9 ?- r
#例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))
" t5 z5 T8 P6 C/ ?1 z
. F1 y x0 T( y( j- Z8 \# ~% D例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
! d) o3 t" {4 D% i1 s( c
. c* n5 {& r' h S& z' U
5 u5 u% j* c0 P) q( d* Z( z- & t$ Y4 P0 s9 Z1 @. P
, [7 {3 c( ~, \4 {) s
& V3 J" A& O* X1 H: w4 h
5 A* n* a& E0 F. t8 p ^, y- , w3 I8 V2 n& n2 _! ?
- ; q0 S' d$ F1 w5 M
# V; W2 i. `) ]2 A0 E$ o h8 W- 6 y4 A8 H( R$ u; f7 S
- O) v: J: m" ~
- ; j/ w+ V7 \* t( q
- + r& T; _% H- N
- # y: [! p/ _6 W
- - R# l9 h1 u( t/ h. f
- ) i/ _. R; a3 E5 e) h. G/ G4 n
- 0 [" S$ q' c9 P% T7 M
- + d0 Q0 K( R! i; _$ c2 A' ]
) g5 J" w5 E c/ s' Z5 Z+ q
* ]" |6 ]: {' U9 V/ ^ ]
; F9 T6 z3 [5 j# `$ M- |1 L h- / E" G& X9 h8 E+ { h# j+ P4 l. |
- 2 ~, y; h9 A. q. Z
- ; E8 W! ]; s4 ?
- ( R" u# C w; }3 Z* U& E2 e# Z
5 O& a/ K8 G1 N' m- 5 W) d1 |/ ]4 A- y7 ~2 W
$ ], Y6 O7 j0 h* E( P' ?
$ Y7 {! j# e6 h5 J$ m* j9 x1 B- % ^/ L+ m3 q5 r) [1 X( M
& M5 o- U) L. C- & I" T! D! j$ E% g8 D4 L( O
- + c+ @) Q' T! E% K+ M, B
- : T S8 b) R3 B" b/ T
& J2 X3 Z2 k3 }/ I% r8 f
: S1 V1 B5 Q, o4 F- J2 |
) F# Q0 O, e; Z1 i- X' M. p
& r/ N+ T3 L0 @3 B
6 G6 @. w' \) O3 ^7 H1 j* m6 ?/ u+ H1 P- t: X: }3 r8 C0 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))
/ z, a, w8 \( O3 X, C- Y% g" `: S) ` + Z s- r2 ^& Q/ h8 [( o" o5 D
8 c$ s2 Z" ~+ K1 g1 A0 O颜色表:
3 t7 i# R1 N- r; z. }3 y! t( ~
. W" f A7 p6 [ L' H5 G |