|
气象数据可视化主要依靠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("···") ! Y/ ]8 a9 k, e8 S Y
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 2 q+ I, Z& E. c
3 @) A& r! {. B% W7 I- 2 _6 j; N! E: R: x* j$ s; P5 q% i
- ) `3 Y' M0 g# A; ~7 |
- 1 m( L$ y; b2 H! P# _0 {! R. u
- 2 {0 B& X ^4 @7 c4 m/ W% w
) P! l4 V* g8 J' q- & c0 V4 w/ E5 e; R, t, b
- 5 k+ N6 S! l- ^. t
* j1 R# B6 C G+ \; F- & A/ T' E. S9 n+ S; [
6 I A/ q/ E) L- ) J$ `7 I% s& z0 \
- 5 u4 k+ J& Z* X
) P3 l: b- q0 x ]6 t3 f
3 ^1 X F; D1 B& c' n
0 i; r7 G/ r/ ?8 l
! Z. \; [5 `+ a! G n
! g+ }! x" ]& P- 6 f- {; r3 d- A$ h
- ! ~9 D3 h, r2 L
* \9 c$ ^ k1 y- - f4 g' H6 ]* W0 d5 v5 d$ H. M
) _- e" s V0 Q) d8 `9 F2 W& ]- 0 Z% x7 q0 m+ a& m% v$ |1 h
/ L" f! A# N1 H5 S: {# m6 d, O
#绘制中国区域基本地图轮廓,包含省界#引库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")
N8 Q+ B; y$ x9 Q/ W; ^" J3 r$ p 5 C$ Y) b5 H) z
' x# X4 z" B7 B, B+ G) C例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
! Z% I4 j2 t( y6 ~! |9 I# X* `
* v6 D( \! _. ^ i
6 u. K- S; f' t- g% j# X- 5 N& Z0 W3 u* Q' p M! B/ D$ K
, ^0 p9 D% L! a; d3 _! Z5 [8 O
) _; R( d3 t9 e0 Q
* a: V( u/ }. q% q* A- ; [' z7 i- O0 d
6 e! |$ C: B5 m9 H$ N! A. A c3 B
4 s; ^ ^- x6 y5 y0 o; y" E- 3 }5 z9 e5 O$ P+ @$ F- X8 m; E. y
- $ I8 z& `/ j) G* p6 n
! M8 B) s3 Z! ?/ Y7 E
+ Q; _3 T, {( r% F
3 j! A: J7 n2 u
' ]/ W+ K" T0 h- + Y& @! Q' S% z# H; a$ }
- . w7 ?- M% q; G5 g {# d8 R; F: N* e
- . L+ r% f- l! {) Y
# ~8 M6 K" J* n, { U( \2 K. y
#绘制中国地图,并标记各省会城市名#引库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")1 V+ Y: Y; ]4 Z3 V
7 v. o: J$ R; ?1 ~
t* _( K2 J: j) \' o0 u! L例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ S8 k; W8 I* k1 t. L" H##绘制有海岸线的中国地图#引库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()4 s: Q! X8 m# A' ^
/ f" }. B/ ^4 ^: Y0 o5 a2 O) U w, ^
* p) T- o" b6 R+ X5 c& l! s9 Z* j
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
1 G8 b# u$ B7 h
/ U! ]9 n) |. t: ?" w1 w$ ]
! @; _5 N: P0 q6 Y+ \+ s( ]
9 j- o% u1 o# H ]9 X) Z2 w( l$ c
& r" ~$ j* P: U* W9 q% w& ^+ A- 7 B) x: I3 t9 q- l" S6 y$ U
- + r# U8 }9 F: ~; _7 t5 ]
3 M. t, x/ Y% U- 7 Q [; r/ G1 r v3 w2 C' q
# l# W" d5 B' _# i
: o$ r7 s- C9 k- v; b9 o
7 L' q& F$ u2 ~: K5 H- # n5 Y1 d5 x/ \4 C7 s) K h8 j8 U
9 S. F# L! C- |/ G- t& r1 i: o# f( @- N( O9 g
. c2 ?5 K# N8 w. Z# j' z- 4 w( l7 H7 }7 q: c$ O' n7 f
- % F5 Q) }( s1 y& g- O* J) R
4 _7 g/ w, ~2 S1 J, s8 Z# I: }4 a; W
. {- b. \9 }+ q" Q- M: [* a: _- ( h. _( d0 X l, M6 r
9 o+ i' g: h' |8 t% B- 5 S! L. v, \* i2 j. P$ L4 K
' ]4 d! N) l( [5 l7 F, c) U- 4 W8 v) I9 p! |: Q7 r4 [1 c# ~( ~* \
- ' m4 M6 ?* F5 z9 J3 d- X7 T4 c6 [
- $ g7 z( p A. I6 w& C
- 7 a3 |3 |! Y4 n' J- S$ ~
- 2 l' v6 T* T% l. Z/ o- r
- % _5 q2 s1 \' `1 L0 r4 _% _
% F* r6 w, U' W& p5 _4 j- w8 s. d- * H T2 g9 G; r! }& _ q; @
- ; r8 b' B' F0 ^7 K" r$ `/ L
. a, _) p! ]$ n q
* O7 l+ k# ^; @# s: @0 L- & I& R/ t9 ~0 F, p/ o0 a, m% }( ]
- ; q: ~7 d, s0 @( n
o6 S! e8 A- Y- 0 c! d, ~( _! L* T2 _+ H, K
- ; W$ B( M1 l" Y4 F0 A6 o0 _
# K/ C" P% b$ w1 x; \
+ w6 \1 z7 R5 a" G, F K- w- t ?1 {
#例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))' |8 Z. n+ T; t# r$ C/ g4 u5 n
" }; r5 t1 p& i" G9 h2 {5 A+ e6 a例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130) % f1 K+ v1 A e' p G3 G; d1 x
- 8 @' }( U. d/ I3 |
% p. T% z3 O( [% m3 H, }, `. E- : V' L; n0 e8 r
- ! z/ H" f0 Z# F" u+ z
- # M; b) Q P6 c( Z! a3 }5 G/ z% ^
- $ ]7 U" z8 |! P) v8 {9 d; }# A
- " _5 C& V s9 [2 F
7 k" _& ^: h# G9 f- 9 w3 j. S4 o# m) [7 {) J% V
! l6 f* G6 n& [( h' C! Z2 l) f- 6 |+ ? a* ^4 W, w$ o( b
- ! K7 B5 i! g- S% O. p& x2 Q
5 z1 |$ T! l! W2 J9 {$ h
9 n1 P& ^% H; B0 o) h o) L; r# e" U- & a/ w, @0 s! Y0 p
+ `7 v% Y/ C/ R4 y* P- $ y4 e: ^" a; L* O2 o4 h9 f; x! C
) b8 ~5 e4 j' A/ `9 ?- 8 p( \& U, v- h4 ^7 O( ~& \
- / j1 I0 _+ @$ l( ~0 |( y! H
- - ^7 \8 Z. `+ @0 [, a9 ~
$ o$ C6 ]" j" M$ P- r8 Q. x J- % p- Z! \& d# K- w
& i( h* ~& ~' D- 3 q( h8 a" |6 Y/ c) R! _7 Q
+ A& y) Q8 v. M- ' c/ F, }, U, w/ X$ e) w* y
- 9 g/ \* F ^3 B! c( a5 r8 K
- ( ^7 Y6 `# L9 {* w
" O% W% @9 \( r; N- # O6 i( o! G2 f; ]3 U. H! {
- # I, ]4 i9 x5 Q4 P9 _- B
/ d% x* X( \% E: |7 X4 k
! e$ U6 T$ M* B/ x
: Q( q( F" [9 ?4 y5 q* G; F
5 u& \7 h$ ]* i) w- $ o2 H! w8 v& G% m- F
$ N1 k$ u8 v; ]$ i
+ F* f( M7 q" E2 e% E8 _! A v! p" {
! ~6 M* x- n" Y& c; B9 S2 R
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))
$ ?/ s9 i% p5 E+ b" s : n4 r. Q2 x/ p0 z' H5 L6 k
: Q4 J6 l) _% p颜色表:
( l# g) w3 X/ x
6 [3 h& X) B. E& y8 z9 y6 @. }, D ^ |