|
气象数据可视化主要依靠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("···") ! m. q" e) y" |* k" `* w
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) ^0 F' c) M0 L- B K" n+ {1 F- 5 [0 P- f. ]. T( U) e8 a# Y
- $ [2 O! G4 n8 P; u$ q) e3 h
- 3 I; s$ T. o( Q
/ P, Z1 z" W |& a/ f
8 B; n! O1 { b3 i
0 N$ f3 a% v, ~0 y- 4 {$ E- K1 s. e- ~. q
0 X, c: D% c0 S1 l/ x+ D0 G
* g6 G+ Q" X5 k& B/ i0 i- 3 Z# z* `2 w) V) K& R
& a/ Q- Z, Z6 W s
& ]0 x& b. D' l1 |* G1 s- ( Q4 G5 X% n: B
) M4 V& C( P# W2 [, x v: A/ E) n& R
+ u. T. c4 w' |- 5 r# P" a* s R
8 y* p4 `0 h) M, N7 p7 v3 Y/ R- * L% u# B9 _2 n$ F
- 7 o! g! o( d) z
- & R+ h x* N3 {
- 8 \3 q3 ^) X! f. f4 Y) j4 \
- ( N: j7 p0 }- z9 S+ j& n
- % [: |/ \2 i% m `2 j+ w
7 h/ _. ]. ]3 h& v
4 _5 {$ Z" C. }1 p1 L4 B# r+ R; q
#绘制中国区域基本地图轮廓,包含省界#引库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")3 h! h8 l! F% o/ x% M
: `9 j0 u" c* _! N' P8 E* e- u% C, s4 u5 h" p( ]
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
; U0 f( H+ I- O# @; X1 G* v
- " m' V Q" y) `/ S: d
! @9 @8 z% f1 H! e9 X- 4 ` u! _9 N& S* z, y
- + b, R# q" W7 _$ Q9 E0 X+ }
- ]8 S G5 v# l1 e( F/ {; s% l- ) w1 d, W6 J2 s4 T3 M% R: b8 }
- 6 P6 u* F7 V- n2 J
3 ^9 A" p! a/ _) q8 d! F# u- 8 p" M4 O6 z' b1 G3 U) ]
- ! z( A. a/ g% b, V
- * `/ A3 M. h5 b# ~' X* S7 R
- 1 u0 e4 E# F) r3 u" f9 e
/ I% f$ }! A! u
5 ]/ Q% u, Y. X8 P( ]- 5 @( L% j' l$ z0 R/ \
- 2 x! A- j0 }0 D' d
- 4 I. A+ T. _3 i5 Z, x1 G/ e
+ \1 F3 d& @( W; `6 ? Q# v0 y+ z. s6 p" S
#绘制中国地图,并标记各省会城市名#引库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"), p1 S6 B. @* T: F" [+ |
/ H) w- v/ S6 C3 S) ?' o F" A1 O% J1 h- J
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) Z2 X% ^ _" ~ A% b7 [ ?: g& a
5 O4 \# u' }9 Y0 j- l |! P& b- 8 E8 t1 a/ m( h9 G8 Y
- : t, b, }# ?5 |* J3 X; z
& F& B. s1 ~0 i N" Y3 r3 W' q
' J' f% L* `! k- e6 e/ c- 2 a7 c* ]+ d: k# M! F. u7 ^
- 6 [; H `5 o) W& k
4 N& s% {3 e, i" o) H: u ?- 5 {# u. l2 a9 y v: }
; S/ q( B4 v6 P$ i- / @7 J. a# P! Y) B
s2 u& ^# s7 w
) |6 H; a6 k. t. u2 r
! V- ?; G3 u' \% K! N- 7 N4 K( m% S. J6 c I# t
; X5 [# K8 T6 _( g& Q
: ^: K) ^& n( \4 ^& @+ G- % h/ f: n. }: j
2 h3 v7 D4 r1 `
9 t/ J7 V, l5 L. U- ) |8 g) J* \8 q+ w
- [; O7 H, \( u8 \$ k- * O" N4 e6 j- U" d8 e* U/ _
) Y# g& K9 @! O% _6 p% P! t; p7 B
5 @$ ^2 r% p4 D9 w- S* E( ^
+ h4 ^ D8 E6 B, D) S- . ^* [4 e* ^) y1 E& f7 Q- {' g" S7 g* h
: W" Y( v# u/ O3 b, W- 4 D8 J- d9 C$ ~# C, d8 D. V
# M. r O7 q+ k0 L7 ?, \- 5 O: y- O" V& T4 U) o7 R
1 r* D' E! {, n& I b4 X2 o j( b6 V
5 ?- R- U! ], ~( q: H- / }: C: x! C/ J, C2 X0 S" m
- ' X$ {' L. U4 y, f1 i: Z
1 u0 b- U! ]5 ?7 n6 p- 4 e0 g( k/ ^) a/ x# h5 ?) X8 n# c
6 V4 i2 V* v9 j
3 \! r+ T: E5 r6 X$ z- {; u, O- [. G- ) o' O& I3 N3 V7 k' ]3 P# a
- 3 \ a! }8 e R$ ~) J8 L
- ) _; k: E6 [* A" k" r: S
/ _" H- R# l8 h8 G* b9 d- , q% `3 p9 A+ ]8 q8 }0 y
( y" b ^( ?2 b6 \" m - - @3 N ]- T* U( D4 n- r
0 K2 v# W! u& s- 4 O; q: `2 G7 L `& ]$ ]+ ?
- ; t* I0 X+ o; Z. x9 V
) p& G5 x. `* O- - k% Q* Z5 M7 M S4 `7 i
6 l8 ?! ]# Y2 K+ {; R' p
##绘制有海岸线的中国地图#引库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()
1 `; E, ~4 x, x3 o F; _; f" H' y! x) G# V6 q" Z
! r, Q: E1 D; @& R) e6 i% L& S6 e例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
. \- r, J6 \9 g- V& E% E; z. y
- # V- v, C# B7 c8 W' l
- , S. G% V J: j4 ^$ }- ]5 m
& g5 ]6 h1 ~: z& c5 \
! K: a5 T5 m8 K* H
9 A7 X9 I7 h3 ^- * k0 \. [( q! ~; K# ~, q
4 N" c1 w! H+ v' S' @
" P8 T6 J: k3 u# {4 B4 _3 O4 P9 G/ |
! f ?) }2 Q) D3 {7 y" ~5 t
g5 L) I5 F( {- ' u, p* x3 h; L4 O
- 3 N1 B; Q! {! w" G8 Q0 i+ I7 I- L* o
6 b9 W# q3 e1 R) e
) ?5 m& G1 ]& @! g: `
4 f( x( f9 o6 C: I# o" Q1 x9 O- 5 Q& p( ^" j8 M: [
/ P8 b. N5 i; ], d; N6 l
( T# C8 |4 v& J
1 w/ [, }8 _7 P8 ~( X( |- 6 z1 T0 L- [ l- M
- 3 g7 g/ @4 q) W0 t3 U
. ^% ^6 E3 T4 u7 Q+ y& b4 Q+ ?3 f
& a2 ?+ E: D, q/ b3 K- d
V, }4 m0 M1 ?) s; e) f
* {, L* p t# ?) g8 E, s
, @/ g% K+ d+ O8 M; ^
( B$ L: w0 R: v1 o- ' @8 S; T/ H% G4 Q) u8 G8 v: c
- 0 Y# m Y1 Z3 T# n8 R
- ) j- h: A% z4 Z
- / P& k% }1 K3 q# m3 W
! Z$ A( F, Y( c9 R+ t3 s- " l; G8 _1 a9 m& G: Z ? u0 F7 L
4 Q" E7 }( {$ `( k; O( b* q; i- ) ?* B7 p* M* f% G, T2 a O
- 0 g7 ^# }& k$ w# i' e
- ( s2 n+ b e. ^0 E2 S' E
- 5 p$ m7 J5 B% v- `% I# e
K6 b1 Q; h, c- ( Z( w2 h8 S+ }9 ?4 ?7 d
6 w* z! @ Z# X, k6 U! L# Y& M5 m% X) x
#例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))
; Y$ J$ p- _: a* y. j ! j* X7 ]6 X' _, l
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
& p: x$ j6 A N. ^8 t" \( o
! Z1 i' Y7 c1 U, V7 |7 V- 2 G; `* ?# o6 N3 `5 i, t
C$ n! T3 }4 T7 u5 H. | t
1 t2 P9 \, |. U! q9 ] ]- % e1 I5 t$ i9 a( _* s7 v5 J* C
8 n/ m6 W; ]* M; ~' F- + [7 ]$ A5 C3 [) M. g% P, |5 X
1 d* s# c: M& T: r1 n) |
4 z' P* W, u& z9 d* T$ B
) r9 ?2 P5 n/ A* f7 ?' m) g! q: V. o- - X ]3 x$ `" Q" ]
4 h$ N8 p/ @ ]( p9 O- ; }7 L* E% m( \
- 2 z; R0 o" S y5 y5 s
- 8 @5 Q* z2 C% q
- ; ]3 @# h, v6 a& N8 f! r* w4 O
- ! s% P4 f' w: R" k) V$ X3 v6 K
) S/ o% C- [" n# F/ v* z" m- ! d2 l* N8 z3 P
- 7 d+ E4 u" i$ I u2 N- q
, F* W8 `6 h. S ~! S: a- # t3 F7 u; C( {9 r4 o4 V
, h; c! H7 n: e- G O0 r
- I$ T0 H( Y7 t! \" y; P
$ F& u* x3 I( J7 ]: y( i
( }8 D: x' w+ K, }! `6 u. H9 y0 H
6 B, U8 z: c0 r! u* E1 {- 6 w# ?" S# E% `4 C: U8 S0 Y" q
0 r5 z+ a" R7 m! _( F. ~- , N. B) Q9 |6 C. W6 n* i. |
$ t3 V9 T) w5 t$ l+ T- : t" S0 j ]) n
- ; l1 C" t! W1 b& J
% }( l3 f9 e8 W" Y/ U* g
% D/ l2 B# Z' r; ?- $ M$ m& A/ y; i" M3 R: y5 A* N
- , V U2 T. [+ V0 f- t0 p: l
- 5 z8 ` H9 k. u- J
$ L7 E$ Z+ ` E, L% g2 P! a! k6 s+ L
1 G) }5 K4 A! E! k9 V5 e' X
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))4 J; ^0 t2 M: O9 M
5 U7 H! x; ~' W) h9 `' j
/ H. Y& l" c. V6 D0 G* w
颜色表:
$ {* U$ x& i' F' h: a; i8 D
* q+ n5 [! v" I0 z- I; e( E
|