|
气象数据可视化主要依靠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("···")
3 H- p& [' J% b2 U( |6 J" z
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 w% c$ E, A/ d. l" w1 h- 6 W& `4 B7 b0 r( \0 a: |( r! A
- / M: |- e0 F2 ?9 ~, o
- $ b- k' r- ^9 Y6 K
- 2 ~" F6 e5 S- N" S
' B( t" E7 s( h/ W; v' V- q0 c n5 u. F9 |9 W' [
* ~& k9 X# h1 r4 Y- j
$ B- y+ N. F6 ?! {9 s B- 5 h C0 I: G$ U, c
- ) ~* q7 u9 K' h& K7 T0 ]
4 |/ _5 ?9 s/ c- / D U5 r7 K z( F7 I* j% h
$ v7 I1 `1 S& T6 J
8 c) {2 x1 {" i7 ]( y/ ~9 ~3 J
6 M1 s% ]% s2 d4 M" j! `# q- 5 @) G# p/ o+ z- ]
- & C% K+ u, y( ]0 O' ~. `
- 1 ^0 N$ J! H5 t# D% h
9 f5 c4 E1 a" O( z
) s& R w f" K" T( w: U
5 X/ J( H5 ~/ j5 X) j4 v0 g- q, D- 6 j4 |9 I7 K5 b4 o0 y( [
- & q5 H& s+ l) h8 U1 a0 J. @
- 2 {/ L# X3 {$ q! r2 [
7 S! G. z9 E. R, F
#绘制中国区域基本地图轮廓,包含省界#引库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")% W: [ V: E/ q( G' o# ?
, l) C* T! M E2 }! }2 a& C* X2 ]% f9 _" B
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
}* S( r; Z: O+ a/ W* a
8 A6 |: Y( z. n, r Y* O, P- ( \- J0 m5 h, C: {1 r% r" d
5 B* p1 l* z; a3 s9 m
( S; S8 z1 a P8 ?: x/ {
8 v" V* e; W# p& J9 ]- 8 |. I0 ~# F+ j$ }% ]
- * E! E$ a6 f/ ]* t2 K V4 \
5 T/ K; B0 D+ z& c- : B/ b3 F6 U5 `2 t. Z3 j0 i$ \7 Z
& _5 J8 r% W6 I" ?; o( K
7 H( x7 ?' R2 c( I! L! ?0 Q1 m- - r4 }1 s3 E, \) T" G% ~* g$ F7 f6 @: j- Q
% H* q H$ U M* n; i5 \" f
4 y8 ~& I; B& G. y: W, Q% ?
* O3 v; S! w+ [- }( [2 i- - y1 N! A' v7 C* x
- 2 H1 d+ s- e/ S0 p8 X6 t
+ |9 L$ w7 @! h7 j/ [6 R8 H* q. c' g4 r- E! o6 ]) X2 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")
& D. R4 p) O+ a9 s
. c3 g- I; q% H* X6 ~4 \4 q K( v3 J- a c0 q, N- o
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 r9 z# c- X& g$ b' |0 T
##绘制有海岸线的中国地图#引库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()
v- D- T. X+ i# l0 l& J2 i8 A% m; d
q L, \. G( Q _& C. g
3 g2 w) \' f9 d3 ~例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
3 d; c$ K/ M0 B( O2 w- 4 Y1 g2 A. r% z+ B9 j! j. ]
: y5 n1 ^! V4 r! r! i4 e* R
8 l& f$ ^/ a* w. ~5 t
$ N- [; X( x% M% N6 m# U0 Q; w9 j- - \6 A- D! V n- g5 C! |4 U6 k+ M2 F
- 7 k. q9 ?) ?3 t
- + y& U$ S# t5 {
- 2 t5 C: f; s/ Q, L8 P7 w
3 z+ v" W y- F% d$ `2 U) l
0 ?6 j3 B2 {5 ^2 |
% D8 ]0 Z4 T$ U8 B4 k9 }
2 N' k: l: _# H- L1 j; e0 d% Y
& M( M7 c/ p: C8 b( ~
* c/ v" [9 |6 Z/ d
; M; R" M w1 V7 e {( {2 ?- 5 m9 r i# n+ A' f5 l
1 Z/ I X5 o" I! W9 O; A, k
+ w+ _5 o9 o I/ y, `$ `1 j( {: {% h
, V3 T5 |. e+ T7 M+ a- O
9 f S0 L$ N! V7 d& w. s" \6 m) u8 a- " a. {6 i7 _: l6 T% s0 e4 k/ t
- $ f) U, b1 G( W U% Z( y" h8 s
, s" w0 P5 k* g
( D- d+ I, `+ n; w. J/ k
1 N1 [6 A( R! R3 V- * m- j0 h: Q4 M* W* E7 h9 p
+ w/ ^6 s$ a# }; M. y% H! E- + s& T) i7 O+ b }2 \) E
9 N; x. I9 p* W; C4 i+ Q! q- ; A* P4 w8 a* Q/ V
" e" o; Q" y. d; j/ u
1 ^+ X5 M+ U4 b, L5 M s
' U0 v9 y. A- c9 [% D- ' j, M- T" k) y6 ?
- 9 v% g2 m! R2 _7 P5 S2 j
- 3 o. @8 T% F/ E# J) U; g" Z, e
4 g0 O* V9 k- e" V" X9 D
, P2 b* o3 [. K2 e( B
2 e2 B4 K, `2 t8 M" O
) k- d+ h. J- k, G( ^# t7 F* Z2 m9 H& e( 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))
9 }- ~4 H8 Z5 g! i2 f, Y
( j; g9 n0 q, _. m" @例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
' b, p% Z, j3 p3 M" e
. I/ X F2 X( ]( E8 z# c3 c- Q n T- u, c
- + g6 e7 P6 v) I( P$ i, S# h
# h q0 o; g7 k- j! L- W U- / [+ m* J# |8 B
9 w2 n$ @6 E- h( T% K+ i
: W- {# C0 o2 ~! d* Z- + ]2 m* I6 V1 ?8 l
- 2 X$ F. K; r4 s! l+ [
- 1 w% l9 r+ w7 ^* F8 f! c; `
; [8 R" u9 S& c* m
' ?6 ~" L+ U# m1 D- J# p! B- - c. {6 W6 }7 i7 U
- ' ?6 @9 E7 o" o# m' j4 R
- 5 s$ ~8 j4 M7 ]4 ^
5 N2 ^; G, G8 M) t. j8 M; i# v A
, A7 X- W( B6 s; k, C$ ~0 i& _
, g) e0 d* O. x$ ^' b9 E) o0 i- ( h4 o' L( X0 j2 L9 Q( D
- ( T. X' Y+ M% Z3 ]0 v! h& ?
* A7 f; K5 F, }# u# a* O
" a5 w8 [8 U! N! {; l& ]
8 u' V" O' I3 w( v- E* x6 M
2 N4 e8 |* D2 w: G2 o/ v- / W5 U( x+ n: a! Q
- ; q: j0 f1 D1 l: m+ X& G7 u$ f
- " G/ h9 g$ J2 `: X/ a8 G
- 2 U; e4 Z: E; N. D, W9 b" j/ x
- 3 u. l& g8 u* H S
- 8 c- A* u7 W" d! y, U
- T# G( T( W8 N! V& G
- & ^9 _9 Y" I1 }! h
- 6 i5 |, H3 N3 U% F# y" N
- $ [- M8 j2 j# p @1 {. p! ?# g. m
@+ }: X2 |8 t) {' w, N6 T. D
7 T8 O: W; E! _! u
5 k, `3 e5 W6 l
. `% _4 r9 r) A2 o. g2 @- ) S( {$ a* E v7 b
3 a3 H3 M+ Y# `+ H2 ]) 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))! v5 c& q6 q) p6 n2 r) g
, L. [ S( I5 Y; e
; P' u2 B/ Q \, V
颜色表:
' [0 W- A7 U+ `/ H1 i# V' S0 G
8 e$ E# Z4 `$ o) L2 a |