|
气象数据可视化主要依靠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("···")
' p+ F) C6 O7 e: {0 G$ m
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
* o8 T7 N% [5 U/ v1 d- " ], ^2 a# T3 \7 t, g
]8 G2 \9 O' @; s( e2 O- 0 U3 {3 c. ?- I& t' U% A9 i2 H
- ; Q$ x! g# c4 s& j
' O' E6 p) j) k" f+ Q- 1 c$ U3 r8 d1 g( @) u
- ; h9 Q- k( \! E: y
& `" {0 {+ f: T$ H( X
4 C% Z7 w7 p. x+ d- 1 j9 N0 D& P7 @7 U- i( C. E" y
- + c! N& R }% I( q. d# @/ Y
3 M; W* ~: [; o- W' v
$ M5 j1 Z3 t: h! g6 [! a9 O+ W6 K- 5 W2 g- v9 C5 Q
4 D: ] T' B; T: I+ z# Y4 E
& U9 N$ |4 ]& j6 W2 F/ e( Y- _, f2 P
% Y. t k& r2 e1 f
$ Y7 q) N4 P N
/ F) v3 l3 F' E$ F- 0 U2 {7 V G& Z& `, o8 P- |
- # a, d/ Q4 s* B# p. p7 J2 }% v
- ' y0 h/ e3 e2 o! b" V. W2 ]
- 6 ]: ?( Z R" t) E( r
+ T- l& R% w3 ?4 h: E( o. ]1 J" R" Z( l' [; W% D N
#绘制中国区域基本地图轮廓,包含省界#引库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")
" q8 \' Y) l! O" N+ Z. F- @ ' O4 y! n4 D6 L5 w( r# B) Q
6 `0 J# u) v. `( r. S, M1 b例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 b1 Q0 \* d8 X5 [, H6 Q9 r2 R
5 R0 p' V8 P! F1 T' ~5 n- ; k1 R" c. R- a8 U: h6 y
- ( b2 s+ L6 w8 q8 N/ g
" e+ }: F4 ~3 L+ U' g4 E- 8 D! w5 K* y$ e5 ], n1 y
- : k8 W) P" K7 x- B& f4 ~* I) [
- ( \! v% ?* o7 Q
3 h4 X3 c; o' v! i
+ y" X: b$ g) ~2 K$ n
! G3 [8 E) U1 [* B9 ~
3 d" E) e3 v% R+ f8 A1 ~" o2 L
; t% `% s( s8 n" [1 V% S; n
5 O3 _5 n5 u" W* U4 [6 @- 1 ], @; C J: u) t
! y: V: P- o/ H0 _: C3 E8 K: N& i& T
8 m3 h8 [; ^) G1 O/ s8 w7 Y- . C4 H1 p" v+ {6 H) P/ p, \" D' F
& G" M% X# @& m" j8 x' d
7 B/ o* R1 J: ~! T6 m$ p- m
#绘制中国地图,并标记各省会城市名#引库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")
, b, U9 U6 w( n q
+ u/ w( ]7 {3 {& \0 S
6 y- E2 U+ g3 f8 ~例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 x S1 p$ p' f/ `
##绘制有海岸线的中国地图#引库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()
5 v8 ^7 C, s8 L; { % o$ w% z/ }1 E; M9 y+ N! f
8 j' G! L: c) T4 o1 X! p例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
; V }8 B5 R* E; C7 \; j& @/ C
9 f+ b2 R. J8 B. K3 t, g) J
$ e4 D( t6 J+ M3 N6 i, b' n- . x0 O+ i6 ~1 b% q
; o& t* g3 Z( V- ! r# E9 s0 Y. h$ x4 b
- % Z6 s' m& `+ E$ P/ {+ k
- / |( H8 c% c; q- Z
- ) s ]0 B) O; |; h2 B
- # i+ U s! p0 I1 l7 o- J
6 l# k$ E3 P+ h5 Y- z0 M9 x- 3 X% ? j+ g7 y" i
- # c) s6 R9 ?: g0 m* |
- " b9 A2 a( f7 A7 `$ H* o
( ]1 R3 y; P: ?, _' ~% D
& A! _# J" W3 h/ m# F$ ]
" d, A9 L: u2 I T r. N
) z# B5 W, b% N5 r) ~, m8 H2 F
* N# d+ v* c- r- n6 [+ l6 n
# o+ C s9 i: r7 r ^8 T# I
/ M0 W7 k* t, ^' {9 K
! c$ S1 F3 x1 K+ _4 m" k: } u
) }# l. E2 |; I0 m/ S' T
: b3 o3 @2 m2 H7 B2 x( @4 D, U- + j5 F3 [0 N+ G4 I# U0 z, ^! y
- $ H! O3 r* F9 f2 Q/ C
4 b2 S$ O; S9 q: U
5 j' y0 R, _. h& q7 W% N) E
. q1 P! _* Q: q P8 x+ N8 v
: _/ P; u* H% H2 J i2 x: t; h
6 C: W( I7 _. i6 x7 ?$ S- # D- O1 b/ f0 s$ D" Z+ _
& g8 a4 P$ N. R) E; J3 Q
. `/ l k0 g+ k6 `4 L/ H' n
' a9 z0 c& I$ F* a A' a- ! {; E. C2 U- w9 E T' _2 P
- $ O o: {6 n9 k! S( {- A7 r
4 I( }% E' }- [- # R: V3 a' w& p# V& U- D. z
- ' K! `" \& |( R
- 6 f" V: ]6 \, t: Z
- ) u+ R* P1 u7 h6 _; ~ g1 i
: H: l/ ^4 I0 n/ v& x$ ~5 d
#例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))
( I6 m/ f! x) f* \
: J+ ?# m6 _: J/ ^例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
3 |+ s$ N5 t! Z A! ?- , F) G% A$ X# d: Y9 G9 Z& R
b# K1 b2 j! f6 P- , b. b3 F8 _' H" W2 V$ b! ]
- % ]( {) v, p; g J/ l1 [
9 L7 [, ?) [/ R1 K) ]" G- . P3 Y$ w. {6 i1 O& m' ~
- 7 z. m' M7 k4 k
- 3 @4 v0 J, ]. H% ]
1 T: a: H R$ z1 }- ! E% r' r$ |/ |" X- C3 n2 Z
- 0 R% j) u- D3 L3 ?* y6 e
9 }2 K& t; w9 d8 R) f# H7 G
( a: @. B2 k5 o
) \' e0 n( y- }$ g/ ]6 {# \
& T R4 s/ `3 {3 q& A4 p8 V
5 B: e9 C7 A5 I5 q
# @" Q5 h2 @1 j) C' l7 G- ' w8 Y4 h+ n: u; b ]5 l& _8 k
- . A, S4 i0 G& w1 J3 m+ s$ ]: H9 |
9 l* N( V/ m" r, d% `
2 K- |* B, p/ N- 3 R; i# J- x1 b* T% h% u2 g
- 1 f% O2 A/ ?6 \/ e- N* X. t6 R
- * B3 d7 ^ w0 ?! L
- 1 j" X9 I0 A. l! w4 H" ^' z1 T
j5 q" L- t3 ^; w6 P% a; J* y- - [/ `" T) C# L% ~- V
F+ j! O' g9 Y& N
. D$ O) V; U( @6 ^/ S n
5 q5 @1 a, D/ V6 }/ o7 r
: R$ h; ^7 ]0 l- g
! a; {3 [# [8 `, T: @% ^- 1 I) T& j, R, K) w& k
- 1 d9 Y, h4 R8 t* Y/ }
7 ~5 H9 f( W8 x2 c* ?' J. S. a
6 Z8 l& y6 A$ b: m
7 O) I2 D- H/ x( a
* ]% h0 g) f8 `0 j) o- W- ( [5 h7 M4 H( z! C
( ^7 V% e6 b5 b4 p) l4 ?- d
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))9 o/ q1 `3 ]% T. h0 e5 c
% C; |" y# v5 p k4 z: k X b' Y( U" N$ K( ]( i5 @( I" J2 k
颜色表:
0 V! g) M) P( h0 C
4 V8 D0 E' M+ r; U/ v |