|
气象数据可视化主要依靠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("···") " x) N8 ^6 w% S7 ]8 L0 [% ~
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- - `# w1 a# l8 {5 ^) {( X1 V: ~
# {( `; k% _* h- j9 Q
" Q/ D' f% M1 P( d, u
; q4 X1 ^: E/ c/ h- 8 d9 K, Z. u2 o: k
' F: [! a' B" R% }7 E
0 g1 i) V" T+ c3 H7 S- x- i. O" y. D' }5 `0 p
- 4 I& }2 n* n. ^' [- G, z
- - c9 D q- P7 @2 h1 s# Y$ ]$ m
- 8 c$ `1 h0 K" A- E. P
3 G0 Y' F. a: T
8 h+ u3 q' {6 z8 Q: D
1 h/ Y' G$ `- w. e( F/ \# c- % M1 c8 V6 a, F# J: w+ U+ h; o/ P4 V9 m
- * Q5 q$ J$ e0 C& X1 r& n
- # x: b! Z2 ^% @ N4 Y/ B
* G& h, V+ S4 J4 k# S6 t% E
g2 I3 ?, r" d* W, N! i( l/ f- 4 ?" s3 H' d' E! v. e
- " l% G( @* t3 m8 J4 j0 t7 c
; F1 Z3 d, J% e0 }# Q6 Y& q1 \9 t- 1 A v! ? t) B) Y( u
5 i6 B! O$ `# x% }: G
% M1 M. Y2 N7 P2 i y- v1 D" X4 ^" ^, ?# H" s* @
#绘制中国区域基本地图轮廓,包含省界#引库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")
) d2 b% }$ a% ^5 t& D
+ L% t- y0 j3 [8 k- j7 J4 I/ ]% u1 T4 N) l
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
% ?0 Y; u% j1 w7 C- 1 y f! U; `- G* ~+ U5 g4 {
) s# b' z8 T8 [2 W; a
9 k+ u4 ~3 z5 h( O$ J- / u/ d/ R5 {9 u
- * U$ w* f% M; {9 D3 O
- 0 h% I$ q3 t& `
" v+ g1 X4 ^( q S2 U- 7 \+ { X/ S7 ?1 F2 i7 r
- ; n8 ~) T3 ?8 g9 @# x& g& ^- i
- " j5 b/ M: A% q5 t: W( V- _
- - j& ~ a' A0 l
8 `" z' M5 t0 } u1 W0 F" I
6 P: ^. h3 u1 m! h$ I5 r. p4 x- 4 |7 u8 [0 T3 C) w' u: C0 r7 ^4 ?
4 d' l7 Q7 F7 M6 J
1 O9 B) x! B" i: F" @$ b5 _
$ C: n& v5 X. ~$ g: F4 Q- # g4 ~- c& [, G1 ^7 }
! Y. a) m+ I0 N1 [- ~) j$ l( D
#绘制中国地图,并标记各省会城市名#引库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")3 ^5 i3 k- t6 ~5 v2 y8 `1 q; }# W$ N
1 @- c% v1 a* H8 Z5 C) V4 ~3 b; B# V9 y. M6 r8 g/ m# ^
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
V- B- a" Q/ i0 D$ u" q4 M##绘制有海岸线的中国地图#引库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()& m2 C V3 F: z# F' j: [
3 k2 O2 ?8 p1 F) M$ o E% e( |. ?3 O& k4 Q0 |
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
3 Y4 t, M! z8 }6 m% |
- % ]$ c8 j! W+ k; _7 r
- 4 M2 q, H. V1 X2 m
, R5 K. h2 f* }! F3 B+ P1 Q" V) j4 ^. }- 6 z q M- x% ~; V
- % E0 Z4 ~! \9 T1 ]
1 I9 }1 Y* F0 S6 v3 v; D6 D
) l) h$ D& S0 k) o. B: K! F$ _
4 }& q" J4 w! S& Y( Z+ t' y# A
8 a; v- h+ F; o- . ~9 @) `2 s" S0 q# L, C t
! C/ }* Q5 ]$ b- 0 M% e: d/ s3 _4 n7 \
( F$ U" P0 \8 S, I- & G4 g9 V5 t/ g6 b* r R4 V0 |; o
% N! g; I9 X; ~0 f# q' B, S
: g# k8 @" d' s: D- $ D# ]* I- v5 _$ ?
- 4 L' `, i4 y# S& O* R+ r! g. P( L3 p1 y
- 2 ~! x( W% n* R. g- V2 L& {
- B4 V c- x" s* H3 c5 K
- : F, e( R; {- W" Z, q
' W9 ^3 f) q' s5 v5 K( s- 2 ?- `- E) \) Z. y( p: m
- $ u+ a7 f2 e- x
- 9 t. }) a4 d" k
$ T/ u; G! u' B S! D1 L- # ~/ l/ |+ p1 s9 n6 q7 w
- / F9 i4 g* e6 M
- 8 R+ I7 z$ v$ J) e
- ; P5 v" C, T$ C. Q1 m6 G1 K. u. C
1 M& O, K( n! E$ N$ q8 h$ M- s$ Y- / e% K# o$ W t% w
- ! [5 S$ @& ]9 I- l4 ~' n0 [9 Y
- 8 B5 K0 e* u, Y5 f4 q7 Q6 {
1 O, t( [$ s7 y# A; G4 n; M- ( D9 O5 Q% L) |7 G$ f6 i
# n4 b! U' o% Q3 P1 U7 v
# f; K2 {$ d: |
' Z% i6 s0 X8 P- : o( u. C) G% ?8 Q
6 ?( J/ M. B% `; J' B8 i9 D7 ]) l, o6 @2 H7 V- }6 W
#例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 A L& \- F# c2 B& ?- i : ~ h$ S3 \) F+ }
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
2 T, I! s0 t+ @
1 [# i1 q7 s$ T2 C- t% m- 9 I2 P5 G! ~. b4 f# Z; C
- , D6 v% `! D- V
- - X; S1 b8 L1 I) {, S+ W2 T; A& u
- & f# u/ M% `1 C: w6 Z! n
# c2 u7 V. ^/ I- : d1 N+ w6 e y6 C0 g# V/ \; x- Y
- J: K! r( y! s: v& k8 L
/ w' A, R. c% Z9 _& o. U2 k
. @9 r7 l% B" ]/ a3 ~- 0 ~- f1 W" c! {' x3 T! Y
$ i9 [* s0 N7 [9 t0 h* F5 o- 9 p; O5 d$ Q, ^( h7 j/ {6 i
- $ _+ v: @6 t' F. f+ Q/ H; c
- . }- @ I& d; `1 a% P7 r) {7 e
* j0 n' F' t2 f! v3 k5 a/ e- J) e2 j1 I8 @- d# `9 S
$ x9 T9 v' F, m8 y }3 y9 [% I0 w1 u B
6 Q( H! V- c% l- m( }
L- T+ c# ~9 ?1 g" i- % M6 p2 r6 p4 E
: ~1 T5 I3 v; c' S" o, J5 Q# ^
- i& d; I* t- v. d. t3 d/ h' i
4 O$ {0 o* K3 X, F- 3 C: ~7 I& y# h3 }* s6 J& P6 @ \) H [: t
- % [- H! J, N8 K& g
: z% X8 s" _$ j- s- D/ X# _- ! o* r/ }+ }0 \! k8 p; X4 o
1 R. `+ G4 P, {+ `( o, T9 l# S- ( E: R& J( L, M3 `1 N& b, c7 B+ F
; Z; R) `3 m/ h6 n
6 _& @' q# y* Z- 3 J% G$ Y( g6 L
1 d( T1 m) N$ Y' e- ( K8 h( J: N& v# I5 e/ ^
- $ X+ o$ a* A+ m {% | I
9 p/ @5 `7 d/ _1 M
. W, h Z7 p9 u& v3 k% b& {- : T; Z( A% W% [2 q B4 X5 ]" U7 Z
( R4 ?2 v' V" h9 ]: P
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))
* p E6 ~ ?# k* A" m5 k
" ~6 p2 ^/ Y3 g9 r1 T) i5 F1 t
; I- l( J# L* q5 m, X颜色表:
" N. q ?/ z- Z$ i S7 w# [3 j
8 k+ k$ r- H4 T* L |