|
气象数据可视化主要依靠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("···")
7 p4 L, j8 r; L+ i1 \3 f
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
& D3 h6 B* W7 q x- , e9 x8 O+ C, m+ R r& j
- 6 G- `9 Z1 Y9 i9 v0 O
- 9 o$ E5 i3 ]# w( ^
- - J- x) v; Q2 u* t" e4 G" F0 ~
- / H' r1 x" z; n5 R
. P% i9 T' J5 K6 b' ]+ X- 5 X, G! ?' O! d3 C
7 Z% W) j& P3 J; G0 I- ) S* G9 n/ j1 H$ J( {1 X5 d
% [! K$ W5 X2 J
6 p8 ?, v3 Y$ n$ x3 T( i- 8 P0 D$ K, @8 W& W0 ?& N' O/ R- q0 ~
. J/ o2 k, n$ b/ Z% v) s) m' G- 5 H$ I# O9 v* ?" q5 q
- 1 V4 o2 N2 U& g& e* M1 F" S1 |! s: L
( S+ W5 C! H- W! }- * {/ \, @' [+ ]+ M: {
6 y1 h$ L, b6 l" v: Q4 ]! J# ^
" d6 y) q& J, _' H: q' R8 C1 u- ; ?* Y2 c9 z A, F( p7 v0 ^
- 8 I" \# ~ T1 x% S5 q- C
! d6 M1 D& f! e0 b- ' c4 V' _5 E" c2 N+ D3 G: ~( ~
' q. l7 R' @ U& O m% c+ F! B$ R
0 ~. T+ G4 q7 o. }
#绘制中国区域基本地图轮廓,包含省界#引库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")9 ~! g! Y5 V W6 P1 H
, n0 `. l* D6 T: K2 g5 D
; W9 \* R% ~7 C7 b1 k2 H) i例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# m& ~( m& H' O. X3 ^) u
- % o! d% V2 k0 D& N6 f, h! \
- - k: ?0 Y+ u& C" C- d8 i! Y; N
- * w/ a! b4 m/ D
$ ~1 }9 p: ^! c+ l- 7 \% Z N% x7 D6 }+ d, G
+ L, I+ j( Z @
4 d, }- J7 F" Y2 n2 ?" ~- * ^) N' d3 n- v2 F
" }2 [+ r) S8 G2 Y
/ `/ a8 P e" ?8 E* j- o- . q: f; L4 _! F. [9 \: S
- 3 y6 m }0 H6 q2 G/ \
5 L' p8 r" r# b& z$ m- ?
9 E+ M/ a* V2 p# O9 F4 ]
& f7 W0 F8 g$ [" `# \
; R8 R I* J, A4 a4 m5 g- ! t8 N& S n, _
& Y1 a4 c; L4 T
) n6 v/ A: L- z- p
#绘制中国地图,并标记各省会城市名#引库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 ^: v2 p3 L3 \1 n
7 n: }- l$ d0 _6 O. e7 _1 L. r7 k$ O% B5 z! [9 u4 H( I
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: w4 b+ }+ ^& O
##绘制有海岸线的中国地图#引库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()
" X- l" r/ Q7 o4 h
8 @0 B4 _/ n: g0 m' F
4 _+ z2 y1 Z2 O% g: Z0 u b5 s例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ E+ V# p! o' V, i4 I$ X( R
4 m9 v8 K9 f5 O5 s$ z$ B- t4 e7 I, S9 I/ G& t9 `9 B
- % O9 R- ~( @5 b$ D8 ?% R* N' {% t; q
- 9 T, N) V) t1 v- R, n) F4 I( w
. c1 m6 m+ Z0 \/ _& q! \7 Q: i
; U, K% ~/ N) F$ s/ J4 Z0 l* |- $ ~; w$ X; D4 @7 U
9 ?, q" g$ g) f( T0 @ P7 V0 o8 s- 4 K8 f4 Q' X4 Z% w! E* |' s; k
. _, Z: U) b R" R: ?& }+ C* c- ( O7 ]+ ~' f( ~ W( {
- 1 I$ L# m; V$ ^% }6 k* Q* p* J
* G2 w8 y$ F0 j& U5 i5 d. ?/ ]/ G- 8 p/ |) R1 n2 N5 {. O; t
! _ `8 r& B* E1 ^$ l- D5 F
) w: }; {' s8 w. v1 P- * q- u0 W0 o/ y W' e) Q* G8 `
8 S; h/ ]0 }$ i; X. u) d" j
1 V# d0 {0 G1 @! j1 y x3 @9 s+ B
# N* |' q: M: S, X; X' @ K. v0 N2 V
1 z& @) l5 k, b4 i: C
5 p6 z t$ {& P7 k- R9 {$ i- : j# b/ I9 z" Q- ]3 P
- : u3 m2 j J; G6 R
3 U9 ]) Z1 C ^) P/ s& b
H$ Q1 R+ F' P/ v& w- 9 ?9 Q# f0 Z: ?6 ]# n8 g) g
H% G3 I/ s- U6 K9 N* H
M. z- c5 ^ l; p1 f- ( \" o; q0 g B4 g
- , h) J. E3 K# M+ q: M" _3 N1 H* {
% R. W- ~9 q5 S4 a% e- $ w+ K7 b7 m* b" B1 h9 B2 O
; m2 z+ e; t! ^1 P) Y7 C# }- . m9 l3 S- p1 u+ e- q7 ~( y' Q
7 c$ L' ^7 O' ?- 4 n& d" N- U3 W3 X2 y0 H
- $ i# V/ }7 z( W) i$ h% Y# g
- 6 z; L6 H" n0 y* i
6 ^! R+ l% F; |( e; |7 v- . f3 X* u% `! ]* g# m
7 R8 N$ ?; f/ Q) P- _
#例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))
- n, `( g+ }! i( Q 0 q( F& g9 x9 J& V/ g ^
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) 6 n9 ]) M a' R8 c) {& l' a
3 g K5 f$ V9 i' c- 8 t) ]5 n1 ]4 r; e" y5 D
x _- c+ E( g" Q" J8 Q* ^
& B$ O% [* n+ R3 ^# f1 A1 S- " u' K# n, Q* A9 z
- - B8 D9 h6 W3 P8 n1 c4 d
- 3 P# t! g$ c! B! g$ M) R6 Q# J
- ( [ h0 y6 y! Y) q* b% l
5 S, H9 S) D0 _" E; e" o5 a$ F8 _. `- 5 P; k9 @ w2 M7 F2 x
* @$ k: ?0 N4 ~$ |- ! t1 n3 p, s8 r% ]9 K
- 7 }7 j q m* u9 Q
% {) {4 i+ J( K. c
1 w0 Z; _" q! e5 h' y: |4 Q
* e+ {$ b- R+ y: C5 I8 Q- $ ?* m! E @4 Z2 g8 d
9 A% N3 j% d2 M8 C3 e# h
8 J5 T4 H' s5 m, g- 3 Y1 o; _- c: [( v( [! W$ `
- % M" k8 x; t6 }/ J* H+ Z
) J. i: Q' E: o8 H+ |5 K
! {- O- m, d5 ]
# J9 i2 }: A7 _6 P2 W- D4 C
! p( ~, ~. c* V# U& Y! V) e% u# Y- , l N8 l& |. C0 k
: T& P1 }5 |% J( P
3 H f5 t# \; k$ j
0 B2 s3 f2 ]+ b" M) c
/ S0 Z" A) Z" e4 j5 W* \2 L. w- % w2 @ |* B, l6 Y
- ' l; R, k" ]( K+ D8 `$ K, b
# Y2 t# F5 v2 H% ~3 T/ s+ \" w$ i- 6 t8 R2 H1 n' o- }
4 J7 e* D# S# D6 G
2 d6 v9 k0 t' i. m
# c; f1 k u) `, i
0 J* }* V- ~+ Y$ z
" w+ q( a- d S% |/ ]7 e/ M9 U/ n4 r4 V' b& ?8 h
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))0 f0 K5 k0 y* u0 b5 T5 W6 I0 X! Z
. a# u& l! I) j3 M: Y
% y5 U2 c! G0 ~9 m3 a; k颜色表:
# H$ Q' \; w; j T a
/ M8 J' O) s, }4 h5 l1 W% R8 L2 [# {" F$ R% g |