|
气象数据可视化主要依靠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("···") + U+ @! s4 {6 m# n+ U5 |/ R8 a
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 1 h0 I3 e4 W' L# x- X- F/ b
6 C! Q6 }, _) X
3 h5 S& U: K }4 d8 g6 q M
% U' O9 T! @" @' n7 X5 {% }- ; T8 v. a& Z" S6 [
- * y& x/ [2 D% U) W) r' t( [- r' \( l
- : n/ }. W; x. H/ i2 i
- K# X" }, r' `3 ^. K
* F+ _3 {' i1 v- % v- h" D5 t. ]: K1 ^: v$ A/ }' \! Z
3 K, Z- H4 F5 z& v
+ J: u+ t u. K- $ W% a' m' W# A7 ~
# a5 g* f( {, O+ J* l- # j1 w4 Z! V% Z0 N9 ~
1 X! J$ z( V1 K* q8 l2 j
& V0 I: ^" \% ^6 V- O8 T U, e- ' p; i" S0 V: f8 M- I; x
- $ H* a4 E* ^4 E2 X$ `, G/ K
3 \+ S+ l( `4 ^. [% H. l- $ q# Q9 M. j1 Z
5 X$ \ _1 X' ]
4 x% |( A( t+ e' i7 B- . ?# t! ~% ` F( u
- 3 @7 @& K; [& }8 R) `9 }! E; Q
+ r: W) ]' H. 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")1 X- @3 P1 ?' c0 H* ?& P
4 K: k2 j; s# P1 T1 Y2 p+ j% ?8 l+ M: L! D) u) n% T$ E8 h& X1 |
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) a y! T C: t5 n! r' _, x2 ]
6 j8 _* J. _/ B3 o9 a; j
$ `7 u( w: i4 g4 T6 f4 z: m7 |7 t
$ q; G! {3 P6 e4 |- & O" a& Z/ A" }" ]8 @6 V5 @
- + L. V3 N% j/ |2 N* F8 e: X* M
- 4 j8 Z. _2 U/ \
/ X" u2 _$ l) R6 h0 ?4 D& s5 h- $ p# e% x% A) u0 P, f
$ p0 V7 L: i! m: z
9 u( L9 P7 G6 }* N; E
A8 K- D6 p- x3 t: S e# w" k
8 |: Q- d0 e* I5 j1 ~& X( | z
8 Q M. |, b& j- + W3 p7 ]& d+ \+ Y n8 B+ l
- ( @) L- L9 C1 m# v' p9 j
- , V6 J8 }5 i7 `+ Q9 J" ^
6 B! M9 O" L" b
# h/ U) v% l3 z+ }! s
+ ~( T P* K: 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")
% S) l' \( N' q* b2 [$ N/ L % `* P' t6 }4 z
: A! p b: A' c6 O, R例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
0 _. z3 m/ E r+ x+ t- U
##绘制有海岸线的中国地图#引库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()
3 ^- V. f4 r1 J* t' O0 A% J7 t " f% h3 e* z* Y5 L' I9 a6 { H- c
( U) @8 j1 k6 a/ N
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 d; |) Q5 K+ |6 ~" l
- * L, u) x- v) h& c/ Z w
( H( _! d) n4 f+ I4 |" k+ L5 J
5 D+ W* m3 [ E* }' }- # k4 w3 a+ k0 ?/ ~# Q( @
- . v. Q* x# `- U6 N- g
- ; `2 N H9 F3 _$ g7 s3 s- P
( W' l3 _7 G/ R4 d# v y: Z; g9 K( l- ( p6 p* s2 L4 B! v6 ^7 X9 L
- # ?$ r# f& q0 _' b# Y4 S# P
" Q* m+ U2 X4 \5 o( N5 U% k8 a/ K+ F
0 ^- {8 M6 i1 D+ r- & Z# t6 J" b" \$ w% F! ~. `, m
- 9 Q5 h! N& V/ V8 s0 |. f
+ y) P; L. m/ N0 D/ M
8 C0 q4 ?* s @6 E
; B3 m9 l) t% `6 ?" _9 p/ l
( Y) t) `4 l4 x9 _4 V/ u
" j1 ?* i2 W1 n- `9 `( A: b+ H- / g: t9 P9 ?* q8 ]2 \7 w
- ) l, z: U4 D3 x2 y! j9 R
- 4 f. E. t+ d5 ~* j1 G \! [
8 T. D/ i; t( k
! J" ?) z# v8 a2 V- N+ M- + R. b! |* ~2 F0 A
- 4 E; c% X) j) F* G( X
6 W, s# V* i: m# N, g/ d
4 \) c1 j4 S1 l9 `. S
0 W/ @0 V6 f+ \# x- ! a! I" ]# n1 ?$ Q# M% g4 M
- ( a# ]9 m. D8 ~2 T% b
c' \- p; ]- q q! e( u& Z) T
" I( x4 m: y& v1 q" p2 ?- 0 S& u" E. h1 d/ ]0 \* ?
, |& P# M7 I* Z1 _3 Q* \) _6 r- ) U% t: @8 u4 f- T; n+ K* _
' R) W( r) n8 f5 ~6 P- ' q% r* f$ ~" y1 \. I
- 5 Y& g7 _9 _6 k/ i$ L/ n) `
- - V0 P: o" \' I9 H h
- / ]7 h) `! v" u, }1 U
8 V- f2 C0 Q5 u( i: r7 a; q& f% L
( D, g: e# s. q3 C
#例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))
8 z/ q) b8 b% r- a$ J+ S* o 1 V$ P( G; Z2 B3 U! w" `
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) & |' Q6 O, D2 p- u
- ' p4 Q- G# S3 f- i* H
- ) M: U( R0 ~( d* H! p6 a
! c' U- e$ H$ @$ X& ^' t- - X/ y0 o8 c5 m% T0 K3 _
- Q7 |5 g8 X, Q/ H3 L& f4 G
% |. A+ t' |5 c# }, i& x8 t/ @9 Q
+ r0 n R) M! P! g) Q- $ @- m$ ~2 K" }: e3 M
/ z7 ~7 f& T0 r" O
; }- H0 x" s" G9 w& T3 p6 {- % ~+ }. w. n' ]
- 4 S& y. \+ x, O, B! G
- 7 H* J( n0 G; S
- $ E1 w; Q$ P8 f# p( c6 m* h
- " E' W0 { @+ |1 z9 F
- ' j& O( t# H5 n3 i5 v% O9 o
) W. I( _7 ^2 E4 \$ e
+ s* r$ n, c N, M& W; ]6 h8 P. f
% p' [$ b1 y+ o' [
& A; R0 c- x7 B6 R4 M1 G# {. z
/ P* V/ j o( v2 f' F8 Z
, ]& D& t2 ~5 m& b* {8 Z
\! C& i/ H( v& i Y- : g" I$ C& @( t/ d% H5 F
5 {, n! v1 u C2 }$ }, H
& u# n. P& W" T! v, U
: L; l' k1 t2 k x# D9 r& x- 0 j2 m( {- g8 s* {. _1 D. I6 A' r
- 6 T w" x* @, m" u* i4 r' {# ?
- 8 ^7 U! P7 o5 t" _! h! \
2 [# P( V4 |; _! m! J5 W/ c8 \. G( b- ( E0 X; C5 a$ Y9 A9 X1 [7 |
' T& e- d+ t' s
# k# L' z! I; W( ?- 2 f- k& E- [, s8 _' p
6 ?& R' Q& v1 b0 g8 h
: x# M; G) o$ d( \% Y7 O7 j- ) u# @3 v. Z/ a( x
- 3 \- b& W+ Q" T2 Z
# @1 ^+ H4 e# t% {3 V% d9 r4 o
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))
6 k( D, v% {# O5 a1 |% @: {
+ E' _% i7 s4 r2 Q8 w- J7 t
/ R4 \. R9 p7 e5 S( o* H! }; \/ y; I R颜色表:
% @* _' u# P# Z+ C! P) E2 \2 _/ s9 T6 b8 R3 `7 R$ y3 ^
|