气象数据可视化主要依靠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("···")
' b; \+ y- I& r7 E
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
8 e7 S7 f9 W" n9 g
: V0 G7 C0 V) q3 |; Q" Q/ G# ?
# }4 x. n. G9 ^+ Z* T8 f
( ?- Z3 p6 W: u6 d& s5 G
: R( { l0 x8 F* L9 `
5 P5 G( K+ L0 T: {
* p7 v. z! V4 b4 E! p6 V
9 U9 u/ i |) z0 } i; ~4 n6 z4 T- 6 ], V& y: B# `
7 M. ~/ S$ K ?- |
; B4 F2 Z) c5 j. L% A
$ E: x+ H& M5 D- h J# u9 p
5 ]& M6 R9 B5 ?5 U; Q( ~6 H- - b- m7 E5 F. w$ u, N# Q% R
- 2 k f) z1 Y' g( n+ Q4 J
- " k( U. ^8 h$ R1 Y" }
- I) d3 v/ Y2 ^, {- # Q( ^2 h$ b2 [0 k
, \* j6 A7 R6 G- ) m* w6 v; \5 H. @
- , d3 o6 \! U+ ]; H3 h( N
- % x1 b' h6 w, I. y+ u4 U
( z+ ~; Z& |1 i$ \/ ^
& G# a. |6 i& }
7 a, V8 f$ f8 v2 o/ ^( F& z( d C4 T2 F* f' z
#绘制中国区域基本地图轮廓,包含省界#引库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")7 c, f) p7 `- X& K
5 m: Z7 m+ R0 F3 w- r# j3 [7 ^
8 Z& B* w' u; ]6 r' U2 r1 x4 A7 J例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
2 h( h. V6 A5 c7 B1 s* y, D
- 6 g: C% D& q$ a$ s3 a4 Z0 _
- & P/ T% ^) G. ~# y6 ~0 |
5 c- F8 T: w. |8 a& ?
5 P% g: ]/ M' E: o2 N! `. N- % Q# _0 J* p/ Y5 ?" f% E6 K
- 7 {# M4 B* y* d# T1 t- j1 E9 j! B
* |* i! a) _2 T$ k; n7 \0 M9 Q
% Y8 ?: y# h! ~* n1 x% P
& j8 p1 y8 b* x2 G4 e4 k+ y
1 W Q3 Z1 f' G5 |' P* H' p0 L
7 w; K% ?- e' x! F9 [4 n$ N
+ Q0 Z! C, g) }+ i
\7 a$ U7 }. u; P& ~, y; R2 V
6 h: M" K0 I! F- 4 h Z) O, x5 a/ Z
- + ~1 m. l& r! @' f) l
- - \+ A* t9 G% e0 k2 I4 @: _
- 1 @* c* R; K' ?
4 \4 l' w" y/ U# x F/ C; u
#绘制中国地图,并标记各省会城市名#引库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")* M& y' w: J8 S# W& @) G
2 E* H' A! F" C: v
4 C q J0 k! ?% V0 u
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
! q% g# J m u6 r. Q
- 7 l" E: n6 C( f2 A) L( J
- ! C* m Z. ~: S: k( B
- 3 Y: `" S5 H3 q' x1 g
- 8 Y1 u3 A+ F0 J
" f0 Y+ l) D( u: Y
* ?7 C7 u, Q( h- {- 2 C3 A0 A2 C( [2 S& [9 k. }/ d
) C7 c# s) B# n1 p: }) c6 k+ c- ; W( e; V7 q- P+ w/ t
! N* H4 ^ ^' t6 @2 p( {
/ `) D: i; W5 m6 j8 k
* q5 i6 D' c! y0 \! X! b
( j* v* U9 T- O. o* }) A9 r& J- 0 R0 @- o$ B6 r" v2 q$ P* `! ?
# U# a, v6 x& {1 Q7 R2 q' D
: i$ F7 p( }% H0 ]+ l4 ]5 G- / H5 K% N. V' a; \
5 K! o5 @9 g& ?
! |0 \. {) z; b4 w( e4 x* ?
) E& A1 o4 Q0 Z" g! [5 y& M& R3 U- 1 P* z/ ?9 ?4 I! a
- / _, V1 ~2 L+ t* F# X$ V
- 3 G! s% ~+ s0 ?& G
- # _) ^: E w: W" T2 Y# Z
- u, `6 x6 M% D& d( O
$ S" ?' N. {+ h
8 t5 }( d- x5 }. p, w' T6 L+ L
5 v3 b* Q& I) H8 D' t& i
9 ?0 H& S( g/ ^! N- 2 V, W3 T$ `+ r1 U/ s
- " a% Q7 P, @# [
8 j8 f2 t$ O( |% ?- ^, v' a1 Z- : E$ b+ V8 v N& u
- * k4 S7 m- T+ I
! Z% m, X, {2 M- w; R5 X9 s1 |/ U: M" m/ Z
0 ]: n) }$ _6 c. F6 H- . b; B9 B, g4 I( L/ f' r( q# Y
, `8 {" R$ X j& [- a, I
' P/ Z% \4 K( [1 r/ i% N- ; o+ m1 k- Q: C
( U: k: E, i6 J# U) I- . C6 U& P2 F: x M! Y$ H. J' d
) i; k* ^5 S0 d' x" L3 @
/ J9 v ^5 v0 p
4 A- q6 D0 j1 u! h1 P _- . b# |) B/ e) g4 Q H+ ?
- & y6 j7 E1 D# k& O
- ( J c! x2 W& @* w0 L6 g
. R4 ~: B* W+ ?" |- . d* l1 h8 q" \9 l; |! N4 H0 }+ X6 H+ m
% h# |4 F- Z4 x/ w7 W4 L
##绘制有海岸线的中国地图#引库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()) G4 f5 s- X1 `. }0 _
* r" O+ k9 I9 A
. b. m' }4 K2 U3 T3 J例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 n1 q" J |- l% k
- 3 p6 T- L5 G# z; M! J. d
- 8 d$ m |) j0 J2 L4 d; W3 M
* q' [ P; z: k) z# A, Y' A# B$ t
/ y+ D/ _% {4 O5 h- ; B& o, |& i* T- U- b) M" ]
- 0 S1 p) b) ]* B6 B# z
$ ~) j: p0 }; {, k$ ]. g- / Z; b0 ^: X' `5 d; p1 C
@5 P& J3 c5 R( |; n( Y& `; k+ V- + U, F9 z& E4 k+ M. |
- : P- f/ E/ S9 |; C
- ! e9 Z2 x; S7 r [
. y" I* [. i4 t2 F- & W$ J) |: M0 k5 a# o
- 5 ~+ G2 p+ i0 T# b
- V. ^" t# ~4 \! l; t3 a: g- $ \' X% v8 O8 P9 i8 T$ ?) B* S
( S4 Q0 i) w/ P7 O, ]+ a- 6 {. }( ?( x3 w
- ; m! c. f( o7 _% q4 e' U
- ) h& b( O7 o9 {; H$ {& g
1 i) x" Y6 Q5 } _3 a# p6 A6 F- ; j3 [+ R* [6 T' M
8 c c: \+ q- U3 r; w+ k- . `) V/ @0 N: ?5 _, J
/ W0 B. u3 C8 e/ `0 X% Y- - z3 A' b' b) E
! s: W: e! \% |% I
2 m* v* Y. L; C/ S1 w
! ]5 y; l/ T' p0 j9 i% k- ) g/ c, f4 J, p9 v* V: x
" O4 _' i r8 ^
8 S% {3 v. e1 U1 j) ?* D1 I( C7 _) s- 3 q- a& o( `) N; I5 e" r0 r& U
- 4 k! d& h4 `0 r9 L" ?
: E2 k5 ~0 @( m) S3 B
H* ~) @6 X/ Q3 d- % P# u9 a) W1 S4 G5 o. S
- ) B0 w' F0 h! D2 ? i4 n
- 0 j Y0 K: c) X6 ~/ Q
- - r. H. I. V" Y6 ]* R
' [* }: o' C) o; S! R( `2 i! a6 a
#例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)); t. d: q7 Y! C) [8 P
1 b& D' t" _4 ^7 X
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
! {$ K/ G+ r; H9 a: B0 s- ! ^% A8 g6 n6 k+ K$ r# C
L; q9 d, [' |/ A- ( y7 {+ O9 \8 R- x5 r
- 6 T$ t4 S$ S$ f! y
' l F# l3 q1 f' b
; R8 e8 }- C# k
2 m7 T4 v% m( A1 {9 |! Y5 F
) X0 Z3 l3 g/ S3 R) N6 U& g7 b X- ' h2 z: R: f& p8 ~
$ W5 U" Y5 a. g: F4 g( d
* A. m! Q) Z# e3 i5 t4 |
4 H7 r1 C3 r9 \3 r3 b8 J- & ?% F0 J# H# o. H
% O, }8 O6 C6 ]6 R% Z# B- 3 P. K4 t! L I
9 y7 @( z% Y* A! R! C: M# o T- ' I- O, b) z" w5 w* h" N
- 3 U n9 l) d. f7 ]5 s
0 p) b! I" D1 d) s; S* M( {! j- & _& R6 A+ M- P* r! ^9 x6 u
, q) H4 \/ G, M0 \4 ^+ b' F: X- ! i, J9 a# F8 q$ Q/ P/ T
- R/ }. F: B( F3 y' A0 `: S
( U% q& ?0 _7 W( D- . J1 v5 x. `" A, } {2 J1 D
- ! U2 |7 F0 t/ e% s9 C
- ) D+ q' y0 S' K
- A8 Q7 Y4 B1 D l* M7 ^' i- 1 T! c$ }1 a' N) S
! c! i1 s- S& |, u- V9 J% P
. D, @/ k$ O1 h+ ?8 E- 7 N& C. p, u! D0 @
" ?) ^# e, |1 `" i/ i
. z ]) r$ Y0 N. s H" O5 V+ m- ( t: G7 D, Z2 p5 s+ _' ^* R5 {
- ! g) w8 {* B; @) q8 }+ m' r
, V- d% D/ W% B; _
7 l1 R0 }# ?2 B$ T! t
! D# A7 u+ D4 \0 U4 G/ D- J" [" o
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))" }: d8 Q/ k& {
1 x9 Z' t [; F4 L" @
8 C ~; H* ]3 I
颜色表:
: Z) Q5 j8 d$ b( O& T# A
# S$ M/ ^' W7 O" ^+ g" D" r |