|
气象数据可视化主要依靠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("···")
; Q! M/ l6 X2 h1 t: L- A
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, T1 Y3 P: V& U# i% }
9 Y' f$ k7 z0 {. a- ! w" ]2 T; c- `$ v" B
0 @9 W8 G/ M3 j# D) T! c: B& B2 n
% ~2 i9 c+ R$ r9 @* v- 4 J/ O8 @- z* K, b
7 \) C- _3 y% [. \. o$ m
4 [9 b# n& U# z% q- W
* p! q& ~! a# b, J5 ]5 v, H
/ v# J8 q- L1 \3 n5 I. A
4 C, M7 t5 i( s5 m e9 I# v) Z& M
8 o% w* F) a6 N# P. H- % X2 {/ K: B* @5 e: e7 O# G$ T
- 6 r* n C! i2 Y- o: ]
& A4 g# v+ @: g; m$ S- 9 g6 Q9 e: p, G) {
- : `2 H# l# H' u' K
/ H% {5 o% a2 ?, X- * ^& Z v1 Q" B/ O
- " X1 n2 N$ U7 m G ~/ ^. B
4 K1 s4 g* T# ]. S2 I8 T* x* D
6 {1 |( b1 x, F R5 ?* F
) @! S' }4 a: H# }, b3 F2 a- . o/ u/ J+ I: i1 R, i, }' g: g% t0 w
+ b X6 s: y# V& d
) i2 r% n; M6 J) O" U+ C4 |7 c7 a
#绘制中国区域基本地图轮廓,包含省界#引库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")( X$ ~: n! R' ^+ }( e) H
" `3 _! W' r$ U5 c! `8 k9 \9 W
& F1 ~- g! d3 V% \
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: N( ?$ C( i% V6 T6 V- z) _. a- . h" V, j1 I$ ?3 M0 t
- : d% F+ }- D" }; r" Z
- ! p5 { z9 ?- L9 h* z8 ^7 j9 N
- 8 N L1 M, f5 a0 D; O
- 3 m, `$ J C" _3 M
- * R6 T! ]1 ~+ O5 x& t# h
4 R& y- X* x! P! D& C
1 T# f c6 v9 K- " V- M: g7 ]9 H) u9 s
- $ p: R$ X N' e: E
- x0 y3 U9 }( [6 H. A1 x4 ~# G% j
- ) V8 k7 I3 U! R
* A1 S! @& s) e/ g9 B c8 J- ( o3 [* R( c% n* x t6 O- ?
- ! K: c+ i* i# B- O
; R/ T* f: I( f$ P
! c$ i3 f7 c% }/ m9 t0 H
1 N% V- R# _. L- S$ g
+ R& d9 `* T' 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")5 U2 I7 C9 U. G2 P
' d! ]: J% Z0 I1 a" c! p
3 Q, s7 ~4 X8 [+ f$ P例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
& [: w5 e B7 F8 g7 K+ F. 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()' \) e6 j1 g$ }1 i+ I0 `
5 M- a# D. {$ W* _
! T/ X1 s3 I+ N! W, g" e# k例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ F8 X6 ~2 i6 x
1 ^, h( n, o% o; s
# K( D( ~" t$ s" h6 F+ _5 _+ J8 U- ' w. N8 z& @1 ?* f7 c8 B
3 v) A: }' y3 @- - f. u _7 o5 R3 I1 K
- ) n$ T! F2 C" K$ I* C
0 s- R L8 w5 w# }: M; e2 s: t- P
$ K4 w% ~& w6 F4 j$ K6 o" y8 D' j( i- 1 m! x2 G4 z' a: v' a& V
I) X' T. g! _- / }7 i8 P8 ?) a( e
- ' K; v$ y9 F( ]. o6 g
3 _* N) O! K1 Y, K* t. U
8 Q0 i# \1 q3 c# _$ F; i5 j
: k6 }+ S1 Z8 N% j( L: k9 V3 Q0 r/ [
# i7 K5 [2 |& E6 Z }% O/ F9 j- 8 x7 ?4 s- o% i, s! S" c
- ) q1 r" {; g+ @" `* l, Q3 a2 p0 H+ P
- . S' @( S8 m, V: M5 h
- 2 \7 S5 [5 z. x0 L% l- s
6 x N# a; R4 k+ `' o3 c- 1 `% e) {9 A: {2 T6 H( Q; w
- ! w: F/ E0 @2 ]# _, m& Z3 `
( t4 k/ e8 H2 z7 H
4 m5 r: y# P# e ~" W0 b- ! x% m, W: t2 |$ P4 [
$ z9 B v4 U2 }2 m% A
7 u$ K3 O8 D: V. z; B- 2 X& A( F/ v! e7 n+ |/ w
2 y' |+ c, ?' S
4 l- Q1 j. Z0 D1 y0 i7 _) D0 Z4 [- ( u$ B! n0 o/ ~9 i, t+ v
- 8 l! G F; D* a/ w' h
8 z" R; R. _4 |6 U [
$ M4 _/ t# H3 i0 s2 V$ g
4 j& R+ Y! H3 j& M2 `) C: u$ l- 4 w0 D) L4 n" b: `, G& q* ^+ f! d- I
- 7 I1 k+ }; [( w" c6 E8 J$ _. m( r
- ; H, t$ m9 M( ? a
- 8 N8 S7 ?4 W( K
- # ]9 v" ]* S8 o/ S/ g. N/ Y4 N+ v" x
6 M: f' p- `$ R3 W: z
#例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))
( Z% M8 z, @2 _3 p6 l
) ]1 z- s1 [- q# d. w! ^4 n( s& O% B4 E例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
6 a4 U( j: M9 W% F- |# m- 9 c. W+ v$ ]" _% ?. s% m+ Q1 l
. | g/ u: }. V* [- 7 y9 o7 v/ A+ h+ G1 Q7 s
4 d ~5 Q& s. R- 0 q, @; B6 o/ x0 r
+ d7 M1 S% ~1 B/ g, r- A
1 G1 T8 ~) v n- 0 l8 A) m' m( Y
- 1 h6 _, D- u. v }1 l- O% B
- * H: m% l7 Q. w" |4 i
- / L6 ]0 h4 g$ W/ F7 ]# I$ I
- % @& P. V5 r1 N1 v7 ~" j3 h
- ]) z' ^& }, m: {1 y
9 s' d4 e% W2 M1 l7 ]7 u: A
# K( i# D! V y0 E
- }, X" J" p9 N4 x2 h
) L" g- J0 Z5 e/ [$ W. g4 w; }- 1 r$ m: H6 b( a5 e7 Q7 D" A
) P: v: {7 i( K& L/ {- 3 `4 k2 V3 v; L
- p+ v z6 I& D' F2 T
: P$ @8 `6 Z9 b! X# t
7 @5 G P0 I5 o) R+ d$ v; M
" z4 k) Z8 q" @
# J% \! `2 d/ f8 l, I" G- + u) S; w4 P( C) x
- ~; E- h% n& b1 I, i4 ~1 S0 Z
6 {0 B3 {8 B+ r# A& `+ m! ~% }- $ `; U- `( d5 [, ~; j/ z7 K
1 S4 d" ~' o6 b+ ?1 Q: z- ' M- m" T" X; d
- . ]% t8 ]: F. t
- 2 W! R3 a, @/ X+ E
- & G* t" [, H' Z+ }2 f3 e3 ~, w9 o* T
- 1 O- J# k) o% M9 R! |4 o
- 4 h# A$ w7 r- D3 }
2 f/ D! y! ?- k/ [
# c3 p7 W. O. {! _1 V' M0 e
1 A! z8 e8 A' e: r& i' t
+ q% W) B, w9 M# f' o: u- q
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))# Z1 z8 ^8 k( t0 s
7 e% p# V1 V0 K" }
* t& W3 o/ k8 S. {颜色表:
( A7 y: z' L% l1 ?
) K7 {2 f* e- Y) N) V- V
|