|
气象数据可视化主要依靠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 ^/ p; ]2 L! q! p
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- / z H6 I! C" S7 ^$ S8 B% Y- {
7 q/ Q: g/ ^ ]$ u
+ c' {$ h- L6 i7 K" X
6 {! g& V. I1 Q/ G- , X/ R p( ]1 ~/ {8 Q& [' y
- ) X8 ?7 t. f3 j/ m- q3 g! B* _2 B
9 L5 v' w$ {1 P/ M
$ q1 \& X+ s _, F! X h9 Q- ( ~' }. Y$ o6 l* N0 M/ U
) \% Q E: m# y4 i- ) k" K* P) W5 E4 @6 J
# x" g1 C S1 P, Q7 S7 e! Y! d- 2 @& M- g7 L# p6 J# g* i
! U% N! J2 c( C- * j4 T3 z+ b- a! x) Y) V( R z6 _2 I
- : ? p# ]" R8 O
5 b4 k& U3 g' ? M: [
! c" i$ I7 i Y5 P9 K! S
, c6 b% x+ M0 ? H- + A) Z E( O# Y8 c; R
( c/ N$ s' c7 ]; u/ A- 0 |: Q+ H7 E3 @; z) Z( v
- 4 l! n, r: I9 U" d8 i0 T1 r
% P0 x- ^- r1 {& J5 A- : J2 Z$ `6 K( F8 T" w/ u3 t1 q3 D
6 B/ ]: U# T0 _: x6 M5 U$ E
#绘制中国区域基本地图轮廓,包含省界#引库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")
E1 @1 {5 W4 A/ ?+ ]1 R& \: D
4 X: Y) @& K8 p; H% F; R8 v
' w% h" W: Y; w- |8 Y例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( v, M3 s% j, P' }) `( Q: W( C
& J+ ^$ t1 I! |9 O2 r$ w9 t, D- 2 s* _/ Q" k& d. a: p, e# D
- ' B; ?0 L& r1 b% G
% I9 c8 _: V/ e3 N& D- _5 y; R5 j# w- 1 ?) |3 o/ A R7 e# ]
- j' c# O! l0 z9 l8 n# h7 v- 8 t# W* z7 B& \% R% Y1 l0 X
- $ M0 N* t+ G+ z8 ^: ]& `1 ~$ Y5 ^
! c; u7 O2 f4 K" s8 X
6 i) ]* D8 S3 o d" Y9 f- 5 ]2 B+ l4 L4 ^0 [; G' X8 r
- % k! O7 E# S$ S; u1 j" u
% N( M8 y% G/ W" A/ E8 b. U
$ [; M& Z$ p2 d! @+ V
- G& |$ y3 L6 K. D
4 D5 N) |) T5 c7 t5 W. O- % M- ?# b% n8 t4 ?' E
/ p6 U W/ R* z$ c1 g6 C! H
2 |( I7 a2 v" {/ x
#绘制中国地图,并标记各省会城市名#引库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")
, D$ I3 c) n$ l% u
& ?8 m1 P1 j8 p8 N* W' I. ]$ j( A) d1 K3 j3 y! C
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 F2 J( o' }) _/ v# T2 R+ g, a##绘制有海岸线的中国地图#引库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()% ^- }% B9 o: Z l! p, P
% M$ A) O* c5 R! M1 k+ l. y/ i" t7 b5 I3 b4 Q- w
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
7 \; w% p) H7 c% [
0 g0 s) K' e/ {. K% u! P- 9 k* R. B+ W6 p
) @4 D# E! W$ k) }5 P- 8 c G. J5 T, }! d9 L3 f
% ~# A5 p- y( R2 y: x& L; R$ E
8 Q) ]4 l5 \9 w. w% F
6 |( q( o! ]8 |9 f, p
5 V }9 N6 G" m: d+ o' f
. n" K0 r# p* |- 6 C' z6 O; p- V4 P
5 w) z4 J" Q' l4 Z3 ?
$ }2 K2 F! }) Y7 O
5 q- i" t* _; u- * P( ?6 }0 [# p4 b' V& ~ @+ V8 \
- 1 y6 w; x. Y* g2 F6 C& B1 ]
6 l$ c: x7 ] w' P* w8 G7 F- D# e- n9 _5 p& r" D# s/ p
4 C/ ~: z* f6 X4 M+ @' L, }7 G
" I5 |9 @) Y* m5 B* o8 E1 P- . r$ J9 J1 N0 v [( s9 p; z
- & n: \4 @6 y p! `) b5 H# q
- - {, V0 c1 Q) F
- 8 ?) Y9 s _+ e! X8 |8 Q
: p+ s4 E" [; b) c/ i1 d {
; p6 n1 z8 } N1 t8 B
) h$ i# j7 B; v. ]8 J- 1 N7 \2 h. C1 r. X
- + `5 e0 ^& {( [8 u) T; O
4 F7 q' {0 g1 y- {4 B8 J( W
1 n0 Q, A$ D8 x: l
% ^/ A7 ~" F( J; h [
4 D2 a" c4 b( ^6 x
, T( n* q5 t" F' n j0 M/ S
2 w5 K7 O% |( e1 G$ d
: `3 H6 o* J; Y. `0 c$ T
1 b3 ?4 l) ~+ n& c- 1 X. x7 M) r5 [$ ^
- + p' b& t$ g' v) S9 @
- / h& N6 v9 T. W' |/ s0 J
- 9 d. ^* F) X f
0 o% k3 D3 |* b8 ^/ [: R/ O8 x) _
' J2 R/ `6 b% I6 O: n% 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))
6 g+ r0 l6 ?; a3 v $ c n# H8 ^- p- E; {7 e
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
! o$ |% p m" z* A* v0 S) z- 1 V+ G7 o! G1 F- p! R
- b, X& `+ I0 U) i& n3 j- ; W9 }7 y" F& [
- , m- D5 _" w# P( p$ l) O
- : |6 v2 C b& a( h& }
- K$ {! W' ~% x. ]# o9 O
3 {$ b1 j& K+ u3 R' y
: a' i9 J- |( B7 T( t) D- 7 _3 B- N5 ~5 c9 |1 W9 T8 S; M
- 8 `7 y8 \' r! C, d! [9 j3 s% V
- 7 }9 U5 K f) Y& m( O. J, l- T) K2 {! R
- / x% b2 F- m: P9 ~6 S
2 ?% G- E5 n [
$ z1 r* O( g1 b% k+ l# ?" X- x- * Z2 ]; z1 \9 k Q- E0 L% J8 H
- , d) b! T0 u! d O2 C9 I8 W: r
7 S3 e- B# k( z: \& y) d! F4 {. M
! I- F' T# d% Y9 ^0 K: C6 d
1 t0 |5 _/ C( G( q6 e- 2 Z4 P3 O- X# ~6 D$ y0 `
7 k+ P* m* ]* L7 P$ v' v1 c
9 ]* V/ n T/ _* p9 }1 T2 K- * j0 L/ G& v$ T/ G2 y
- 6 {8 R: H" |5 K, q# J
8 a; j* a3 A9 d# F
# S4 I3 \% {* c" P/ c8 l
1 J& u# `0 T; y( B, h2 }5 M5 l! e
8 U/ S; T* ^2 d' s' K7 s7 N. Z
" t+ [$ s" D2 J8 `) z* S8 ^. Z- 4 Z$ x. Q% N0 N9 `. C s6 y- g
- 7 `' x- p' k2 H1 Y' L/ f0 F- v# Y
- $ ?! e& o; A- [2 B5 `
: |& T% P. Y; b- " z5 G7 R: ]: W6 @
& i# B/ r& ^7 K5 ^( ~- % G/ x% c1 Y' r7 D; n0 O4 _
- 4 Z- G9 o9 S1 w( Z. W! {
3 [' U0 |% z, M/ F
6 h! O# a% B3 ?# b% G- m) b3 ^3 l0 b1 c
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& r- e$ i- R8 }
; k' R: A( G; X% O! v
* O+ h. ]3 n9 C# v6 {颜色表:
) i: `- C J! h$ p$ N3 t9 s
# ` B+ f* K4 q; D6 _
|