|
气象数据可视化主要依靠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("···")
# ~' U# ]/ _+ R/ X
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, @$ I" U+ }* s0 c
( @7 x6 ]) D; o$ E) g! }( [
+ |# o+ l# c1 ]! L) O g7 V9 m: C7 Z- 7 H3 Y# q1 a0 X0 `
5 H1 B3 i% w% m1 a& g- ]7 N! z5 d
$ n6 g- y2 j& _6 k
" s" G/ X/ k7 E- M
+ {, [2 T& y, w! X/ _- % ^5 [& C1 \6 S
- R2 w& O+ e0 i- * c$ C O0 Y( h( a1 T; m& p2 V" m
- `9 }$ C0 C7 \7 S- G5 J4 _0 ]8 M
! V6 t, K: _+ U4 \; d: _5 S- $ A6 C4 w( U- p9 t
- ; v6 U6 D1 J0 H/ ]3 r) [0 Y
7 L8 K( e! k8 Z8 L, K- , l+ t2 A. ^/ c8 i
. }9 m8 N) E6 v% _, G3 @4 R& |) k
" E$ q: N2 `& ?- , p$ b) \' E! r
8 F; {/ d1 v( J, }; o
/ ?: h' V/ u: C+ \- - i) J) w9 m. p" P% R
! A/ p+ a/ O8 D( C+ M7 T
7 z( E. j% Y) l- U
#绘制中国区域基本地图轮廓,包含省界#引库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")
% @* L0 d' L& l( I/ x & F I3 y8 H3 h5 v5 c1 E
: o$ F2 o5 \2 }( d Y7 K
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 f6 R' H& @7 [5 I- : `/ t! K3 }4 j' M
- ; Y$ N/ n$ T8 [
- 4 ~ p! `- K8 M6 ]4 k+ ], b6 v# p
1 K$ G0 Q( v& b/ x8 e
! U4 w: G5 [! d- 6 V: C, I, v" n3 U
- 7 T2 c9 l! h8 ]1 h) {# h' z! C
" G) I2 p$ v4 L! ?+ [& t# R- % F1 s1 Q2 Q' E: |- y: w2 ~
- 7 o; V; Z2 @6 ] |# T
- * ?! ?. t/ p( w
- . n4 p- D# U% P4 `. z
! q8 l R, X$ f9 B$ m" ~- @
! e+ P6 \% W& |8 R- 6 E/ p9 e" `8 X/ [) i) @# `
- 3 P* S* ?& p0 M1 d5 @
. l3 v& { z* N9 ?8 F- , L2 j u9 @9 r* k
: i; ]/ ], G, [5 Z" Q- g
#绘制中国地图,并标记各省会城市名#引库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")
* G! \: B5 o* c8 B6 Y6 G
7 c! ~; ^) S2 A, T z
& @3 Q- p0 B+ j# _- }1 |) H. N例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# s7 i4 O/ {( B0 i) ` Z##绘制有海岸线的中国地图#引库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()
" R: ?0 f0 y2 E5 C- a) e9 H $ o1 ]. F+ U6 i8 `' {' c7 g
5 _! p8 c6 p* ~0 O. ^2 S# p
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
) r; Q! H) D) f7 i# l5 u
/ c6 t- C2 B+ z7 I8 ~7 \ C- 1 V: |9 ?- v+ i6 k8 }
- ; m# S& U( u, a- a$ J
3 ]5 D. e7 n, y( ], y
1 v$ P1 X$ H$ X/ r5 \* G& n% t
, J& A- \$ ]: i. A1 q$ B! ?$ J- h& M- e9 }. `# E
- " A/ \ A) r; z: C2 ^& x
) H; P+ X5 q- K8 q- / H( ?& b8 T/ k8 ~% P
- 8 \& @' R$ ^1 L' k
' o, m- u+ j- m l# V. x- ) j+ |" p0 z$ T0 R
- 7 p/ j: Y; F' B
- 4 C! Q* _+ c2 O' \- {8 }% w: C
- 0 X1 d x# z6 y
3 w0 m9 v w1 j E0 n
6 U0 i7 \: y3 S/ A5 j- P; c- % M8 @9 V, q L8 L: h
- / U( ?7 M+ a8 a2 x7 u
- % R9 t+ f; G- f$ ~
- 7 R5 {4 ?2 p. `" Y% R
- ) Y, T5 O1 B( J. K
- . |& h* y# x5 m. ?: j' I
7 L" q5 Z& ?" ]1 C; P: c" F
- i! q5 K5 i" t! U1 a4 [/ f
& I! r. I; ?. Q/ _" ]1 `- 8 s7 C( P; y/ H8 c- Q! d) }) ?
- 3 P* l; I7 x) h9 ^+ U" F
& _& m" @! k% e
8 F* o L' s1 c% ~' g: }- 3 z6 k) c. d& K$ M
- ! _7 ]4 y n7 N. T' o( @3 D& ^5 `
- 7 y: ], f6 d+ _+ f# v( H& y( Z
! M5 i: f; K( t: C2 y" q. m# V
& {7 B' ?8 w$ A$ E( E
! r# @; \/ Y% I" Y1 y- 2 j0 k5 @# R7 Q' j
- ( c) `/ }8 g7 j( N
# d! v9 w; I1 {2 M5 l! j" C- 8 E0 `, v7 x! L. ~2 ~! ~$ m
, Y: Z" ~+ v* i
#例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))
% U9 k2 {1 w8 z( @/ }5 S . j0 [7 i0 G9 q
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
# p$ J& d$ T& ^1 w6 m0 S- & z% R/ g1 w. u: `) W$ J+ Q+ e
9 N% T. b3 K! ]1 M! @( v
2 L1 h/ t2 U' V8 y& |) T! A2 T
* K2 w& J, l6 G1 [6 b, {
4 |! c8 T0 ?! @/ [( Y. O- 6 \) U; G7 b6 R% {
- ) @1 ~) d7 S* E: l: m# y! \
- ' \6 }. A" @8 N
- ) u! S$ F' A e, }
- I) X3 d: b2 _2 o' {# X- }7 G
0 x5 |" p( Y3 a) p7 S
8 o3 w, K8 b+ T0 l$ B- - }+ N( p) J: R5 [
/ C% y, K F/ D/ ?" W
1 J5 [/ o7 l4 V
7 ]; |7 V" f% M1 ?! b* F/ i" P: l
6 j! L4 U5 K" ?2 Y O! |* p" H0 S
% n( G5 Q4 c% i3 @9 n0 z1 R- 6 k0 E! d7 K2 \: K, B% V8 J5 a; c
( J( q6 H1 a7 g8 c( h- ' S+ \6 l2 M }" R4 `' n
- 6 b: d* s) r# h( F, j* |
( P9 Q% A1 s7 W! T+ q
% {) D2 r6 F, H) B; Z$ d! f/ Z- v
y, R( q% ?9 A2 ~2 D9 Q- 3 U+ p$ e% h3 [: j
- * e6 I c; e) }
+ X5 X- S7 l3 j, R. [# M8 {- 4 o P5 Y. M) Z, p
- 5 r9 I( R# e+ }7 b7 b8 v" r1 Q) S
- , t3 W; B7 v% p$ _$ K! |' j
/ `$ H: e2 ~% Z: I9 L+ ?" |- 5 ?" W1 O$ _; s+ `5 g, l
' i2 Q2 [7 J# y1 I. F- : j3 h8 z( k2 ^2 W7 v9 I6 [
- ( |4 P7 j+ `/ ]6 a$ } @0 W4 ? d' z
- % ?& [) H- O4 u \
1 H, h3 R6 A" R; a& i- t! |) @' `, k# Y( j0 n# T9 f
+ M, _4 }% a* O, z- q' W2 S3 T
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))1 d N" x- U8 k \$ m3 m& @; M
* S0 h" r, r5 g5 b. ?
1 O$ H/ o& ?; I* f" a) r: W0 e颜色表:
2 ~0 @& O+ n" s
2 k# l+ ^. G2 { n& X6 v# a |