|
气象数据可视化主要依靠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("···") ( ~6 g* o N. U% Z3 }1 T
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
" m% Z& d& {3 T
J% R& f6 A2 |- p# p6 Z
$ u* i- d r0 R, `- ; f8 K( ~0 ^5 ]( N3 c7 x: v3 o
/ P. I% c+ \8 g; C- . y( m$ X! y3 d8 b; ^) p0 |
- * Y+ B3 a9 [% r0 c
- # |4 U6 F" W1 W( V( A4 O& F _
- . m, ~+ n: P% G! K/ g! L; ~* I, d
- G8 ?1 o! Q; \& O- T* R4 y- ! k5 X: i* I! \
& g) P' s7 B9 w# v- [$ ]# x( L
$ O' H0 ]! W% j8 `) v! M- 9 V k) d. d2 U+ k" R2 _" {
- _3 e+ [+ T4 D) M2 Z, D
% g# `5 D" Q [- k- 4 U- g: |8 V5 k' V1 a: Y
5 z7 F' K0 S0 M' H) p6 v- ' _2 T, x( q7 D8 j4 |8 G; c2 u/ e
3 Y5 O) W4 h- x' O! m* }' R( w
* L: J' ?" `: o9 L: a" W- : A3 }0 G, l. }5 ?+ a
) ^' G% u% {; G4 X9 j/ Q6 R8 c
4 Q( G3 P9 D2 a3 i/ s- / F E8 R" m& a! T: w+ H: \" }( }
) W6 J# a$ S2 N) R: {( j
#绘制中国区域基本地图轮廓,包含省界#引库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")
: n% S+ t. O' U6 C
3 |, [" ]1 ], u1 I$ Q
- {* F7 u# `6 a% ^例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
! m; C3 E- u) z, H5 B- T
3 j5 F+ O) y& F0 L+ [8 |
! k( _* l/ U7 X4 ]' l- ; h9 X0 _/ P) q$ W" x j5 t/ x
6 Z7 x4 w" [8 _) N1 s5 h x1 E- . m- f' d: a2 {% F% v$ C7 L1 B9 t
- 8 P- K& q! O! t2 M- A# v" p) G, |
- - o! g1 e, r( u' q. A8 U% ]$ l
- + \3 h2 K, v9 ^5 n; T$ V8 E
- $ q& b; R: E s: C" M( {
- - ?8 V0 x9 H( c, N# |3 U
- 9 m0 j) r& t; Y9 l
- % C" s1 H. |3 e% h* x
. S1 d5 ]9 M7 F- 8 V! H# n& x( q
1 K* D4 H& ~; y8 l o- 8 s+ ~9 `1 F2 Q0 I
% O0 ^5 Q! ]* W! l Y; ^- $ o" y. b( F6 {* T6 v5 l
& E5 R7 ^1 f7 o
#绘制中国地图,并标记各省会城市名#引库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")
, L) ?/ U9 V: W+ [5 I 7 C9 S& v- j: r' I
7 M$ a8 _1 z4 h8 N( w$ b/ H4 T" Y; v例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: S. {2 b1 o" t# v# G##绘制有海岸线的中国地图#引库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()
6 T) o; c" ?. H ; U+ r/ i! h9 C3 b: Q+ b
& n" E4 g9 ~- s2 ^例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ _7 x7 j# J; N; L, I: g
1 T. b. |$ F6 c& }- T/ s) D- 6 g) d5 s; A) M
2 l. [- K) Y! r. |. T0 y
+ k5 m5 T5 i/ k5 x6 s. m- ; J% J h. x* c
) G8 ^7 N1 g$ b! J" Q+ h9 N& W" z- / b4 T! n C7 s2 N5 Q
+ i2 D" x, ]; l5 s) S) x2 y
7 ~ m2 i6 s( k! y& G5 Y7 b7 y- [
& O. Z0 s! T0 h2 i& A( W
/ z, R4 ]0 j V! B- 2 p6 s8 H! q/ c! x4 G
* I1 _' E& I" ]& G. f2 U
O4 M7 X# E2 w3 D- & U4 i4 i0 m2 I" b" Z4 y6 D9 U
- U# b" @8 Z- @9 N
* g- C% [' @- l0 B, m8 i9 q
9 w) Q% G+ M$ H0 l% J. Q! s
0 x3 K5 k% O1 R# p* c; V- 3 z3 Y( Z+ C3 F& m7 f. F% z
- 9 J- H% B# E: h% L$ `0 E1 n
4 e& L/ Z' P6 l- - K5 h r& C. n- [" W, \
- 9 n/ T! K$ q$ ~
* P( c$ Y5 u) R$ ]$ k- 6 X; f: ]8 i% F+ O1 v* |
, Z, @1 X7 I U c5 n
2 G$ C5 B" H( V( x2 h7 ~9 M. G- ( j. s% l4 |- Q" P7 p
- 2 j- p7 {' F) L
8 g% d. ^* J" I; I7 ~- : N$ V6 K! ~. e' T1 F" w- s5 M
5 v1 ]2 |: K4 X8 w9 u$ W- - J" t% I1 P! |$ l- o3 a
4 u- N0 y; J1 y6 f, W- 8 u& Z9 }0 F2 M. Q
( R8 a3 ^# x U3 q% q
6 t: o, k" L3 B
0 r% C* y6 j( R" _2 ?- , |9 l2 [; S2 E7 t9 h3 h$ D
- 5 b) M( a1 L3 |# c+ b2 s3 s
1 l- ]; J) o8 x0 Y7 t& h, T
#例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))/ k. E( q8 b" L& I
$ e$ w9 X, Q2 b- {# J/ S' S例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) & j$ \+ Y! V- K( g% y" W# ~
- / K% h! l+ M0 O6 `* D
. {) D' n- y% m$ \& f2 O' q3 J- d) R: [3 Q+ u& W2 U
+ v* l1 m/ b5 d* a- 9 E3 a9 z* G8 I4 Y9 m7 P
1 }" n! x3 |: B2 r6 {0 l5 O! z- 8 s! e, M: w4 H3 Z, Z4 R4 a4 W( }
; \3 L E5 {( T% r- 6 i0 b3 h+ X4 v! t
- : C0 a. v0 u9 a! L8 v) `
. K! `) P; L. a9 c. y
) S$ c1 J$ ^3 u2 |" _
3 B: n5 Q; |) }! F* f5 p# R6 H6 F
- |- m8 M/ f) C( e3 n1 G- Z; |- - r' s1 |, [! N! z( z% Y
+ `8 z; N7 w1 a' I+ e
; V( k7 V& e8 J' h; ]. k [( U
; N" o7 ` h& A! {7 H' e- 0 S% t8 K$ Y% v% S0 T
- 1 \& }. |! ]) O# _$ z: D
! ^0 M8 v- E0 C; n1 Q0 e* c- * p( W* s* Y/ y4 m2 N+ e: x, w
/ e7 y1 w6 C) s0 Z; T3 M6 N
# \9 q$ c% i, |4 Y# e
, H' ^1 P% g ?+ e- p$ T6 v" p
9 L! w( P6 Q& j0 g' s' i0 P; t
/ c/ |' o8 E. x. W) U& D9 F* \- 3 z1 ]$ Z) S9 u4 j u4 e- ^& p, _
- " w( M% ]3 U8 I8 m! W
: `0 x4 m0 r$ u- 3 r/ m1 Y3 O. }$ p# E( T: ]. {
7 y/ e6 E7 `& O9 m5 Y- ' b( F6 g. U. f
$ g% v; l/ N9 A' B) G
8 @ v8 I$ z" p: Z+ |- 8 d. m; L4 o% @& J9 ]
3 K- I% m* h$ K- X$ ^1 e ?
! H9 y9 \0 z. M6 A) e# _1 P2 `
2 g& g' L* _5 O1 ~7 u& K
9 V" e Y* d9 U2 @2 D" e2 e
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 S9 y @4 O+ N; L' ^* a
3 t- P% V1 q' }/ K# @
# ~' }: J2 P6 }+ {; a- Q" [
颜色表:
: X$ R1 d- [* c+ l' t3 j' J; h d
|