|
气象数据可视化主要依靠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 e3 l. T, R. m
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 2 l/ d. S0 F4 U& n. F0 X ?
% n5 H. \. o' y. i
- Z. V+ F4 x% E; ?' e- , n/ X3 L7 @/ s4 @9 e2 b; k7 k! r
5 }( z& D; B! ^' K! a- ; a" ~* J+ l+ p- A% F- S5 ~
- 4 G7 I3 v2 N! v% c0 a4 T: l( i* d" f
- : `4 b6 }+ K& n. e1 w0 b6 b6 U
: q7 O6 d; t2 J5 P6 E* H2 \ o6 R- + F9 y' a( d# c' _
% F4 L6 z9 K& L0 |& l, a: x
8 \: r) Z8 _& e- X. D' e- . W) d. U- E* ?) Z/ M
- $ ]2 }0 J5 d2 n7 M) x0 G& z- @
6 s0 P5 s% r* u) E" P0 [2 d2 s! A- " M" C- r* m, D; g$ ?+ c/ U
- # ?' W7 v4 K* s5 U6 Q
- " Q7 y: h" U8 N8 i) j
* P2 w$ B4 U; n- [9 c5 z) |5 K
% H1 c1 a& J( ?3 D$ u- ( h* V. Q# e* y3 w( a
- ) b" ]. c6 O3 g( W
1 h9 m, \- y+ ?0 K4 R$ j- / w7 ~ o" s5 C" j& X( o( @# \
, N& v/ |4 ~- o9 m$ J
9 u! O. y4 {+ E; ^ R/ I$ b
#绘制中国区域基本地图轮廓,包含省界#引库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"), ^% g9 f; a- A0 o- n
" F- e/ [2 K8 z5 h6 x, p
3 K( Y. U! x) p6 \例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 H1 v2 s0 r* D) ^0 W/ |, n
% R0 X9 U/ T# k8 z5 ^! [
9 K% \% X2 c" D, Z
6 @- E2 O% n! ?" [- 4 z& s- q! _7 K% ~; L
* @$ B! U. e! C$ q: `- [
: y4 y% z% c# e% v6 r2 @# f" p, E
! G; `* i V; _3 m! G5 ?
, X* u3 S: ~, f: f) k3 J- & f; G2 W1 n4 ~9 r
( A, {- G2 o- G6 M
3 s1 Q5 y3 i9 _! }- l( F
" m5 o! J/ m7 W# {) i
* c' e' V% z# Z. ]* @- 5 ~+ u9 Y/ _: g! _0 X0 Y- @
9 T6 Z" g/ `. c7 S& v# _
8 ]) O' L# A. Y9 [+ J
: j% R1 ^1 {. `- . K' c5 |4 W: N( h
5 l4 k. B' ]* c' I/ U4 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")
, `" `( q. u8 {( c1 e, D6 K5 x2 ` # U U7 n, D" ~/ f& Y
' U0 U" O9 a" a$ c6 D
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 f6 k& Z9 O. p/ y7 l9 g$ P
##绘制有海岸线的中国地图#引库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(); o4 L6 F1 d6 Q! u# F, |: ]. s8 P
6 P( M& [' s" B, h- @
6 O$ f& F5 V4 ~6 h
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ S. _5 I4 D3 ~+ L$ k/ }- ' N+ {" P s% E* d; ^+ h5 H/ y6 w
# P6 {6 G& z* h# q- D) u) x0 d* K" e. u
6 k# ?9 s( [: I5 y2 o4 E1 `" \0 S
/ F4 q. s7 X9 Z! s/ }- 6 {( x6 k9 M/ X+ z7 U; K, Q/ A, u
- # x1 R3 h; i& h
- ; c- I9 i0 X# `3 v( i8 n( {2 c
- - ~: w. D( a( ?2 X' p" o# N
- % S7 `; g i) U& _' B6 O
, e E) T+ B9 C9 b5 P: N" r% C' @
2 a3 t. B+ M1 B) R1 }6 b
4 R' n) L' ?# d
: U* f! I; D2 ~9 j; l- 5 `! n( Z" A, Y+ w4 o5 M# ~
- 4 B, M `* H7 L7 x3 z3 e
- - ?/ m! ^& ?0 V, }1 \" I& H
- 9 k$ `, u" w! L6 P0 `
- 5 H+ a! e( b+ i6 y& E
2 H2 q2 |/ o8 J5 a- ~6 q1 m; y
4 _; ?6 Z F3 ~! o y- P; m* E
- n& I; N" R; H2 j8 x- ( n* `1 R1 E$ g$ t
- , S$ W$ V& g3 Q6 k0 y
6 n4 R2 ~* O" W
- Q' P5 g+ E; m* g- N) {- / F# q# i" m9 {, _0 x* }1 c2 C
; B5 q0 f b/ O. a3 o
9 i! }* a; D2 z/ \4 {: Z- ' `6 [: R! S2 N/ }2 W
- 4 ^) M, |7 G% S% s; f* [2 l. {
- 7 [5 b3 |) t+ `
- 8 R& K# [+ u$ X; t$ i5 r
5 S* W2 H+ Y% G7 U0 V; @% ^
1 P, u" q' e6 \, v( `
2 _- `/ W! W" _0 w+ S i- 9 c! Z4 p* K( S" i* n' |
- # {4 K+ R* b8 Z# y, B
- ( D, U$ v2 U+ M t" X2 h
- - F# f# m$ j% Y! D
- 4 X' l2 Y, S3 z- v& Y I
/ k: |6 b! u7 ^
#例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 @0 `6 H. ?! k
0 M/ B- |. q K# e& }# O
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) 5 r+ _. w/ e/ v: ?* E0 i z
) M8 }5 G; p) N' a4 R- : n0 a4 v" Q' `
- 3 |9 J2 M8 \& I3 y! n0 h
- 1 B" x/ N- x, h1 g
- , j* R- ]; l P$ }- Z3 m. w
- 9 M8 i" }; }' m L$ `3 H2 E
- 1 j5 X6 a: q; e
- 0 p% A9 x3 |& k' O: d( g% p$ I
9 p" s1 h0 G* n# f s3 |6 Y- . i" u; e' a% ?: v/ t$ N- E. r1 {; i; Q
- 1 i) s Q* D* o2 c! p$ N
# V% `) B4 ~' l# b1 R- K- 3 d* ^" M$ N1 G( f5 t; c& u
- 3 i2 s) h* P: \3 C2 l- p
- 2 r7 ~+ K* D5 q, s1 L- G
; o9 @3 r$ `( y/ |
4 |+ P, r; q9 b1 |6 C" p% r
6 R$ @: h2 h0 X
1 R/ e% U; U/ ^6 z4 W8 S& I- ! V& }0 r9 g) p; W) H
- " X0 z$ J; I8 B( E" |; O
- 8 `$ ^4 ~8 W0 S; n- b3 U! }0 `$ G
- ' q9 J# _$ y. @ F
4 m+ A. U% ~# k2 e: {9 b' H0 ]/ r- $ h( p" P; |4 H+ A' V% u4 J
- * d) S" {7 N( i" u. |8 x7 m: E) T
3 R+ E2 n4 G9 R) Q$ ~+ i- ! ^2 K( O2 q0 l H& [( q" l
- , v2 v5 }) e2 X3 ?2 r
- . W% C+ q& w5 e! z* U+ d2 @, A) e
- / B8 ]' u$ N; V1 t$ J
- * d% }0 s' H" \7 x& G& K
- " ?; b- T% u& R% V% E& T6 p0 T0 g! R
7 e# E2 h. a7 b. L( x+ o) A8 t- 6 H! Y1 D3 S# f+ `1 v& T' }5 R
8 q- {( Z1 b/ H0 o5 @- k; A
. x4 ]1 O( B6 `0 Z; j5 ^" g! S- F: ]! D+ m0 g+ @
- $ Q* r; f$ u% w$ q% n9 j8 P& O
4 S7 o6 T# Z" v, U4 T! L
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))
2 R* w" ~* M: C ! f! Q4 C. t7 R, r, g: I3 T; |7 X
1 g8 L( Q# J. I0 f
颜色表:
/ P+ ]( @" R+ z4 T
' h* v- S) r" c* s4 [8 R |