|
气象数据可视化主要依靠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("···") 2 P1 v% r$ Z' T( C( u5 Q! e5 n
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# S0 n0 p; s) R; q" \- 5 g x$ m8 ]- Z H
: L* T' N( D `7 J) d% t
2 x, l4 i2 r6 Q# A+ M
. @( K9 [) r0 Y
) ?5 y) J/ P. i% S4 h [9 G( M1 t& |9 J
# J+ T+ o/ o2 V4 f$ G B- c- # i+ {) I& o9 m5 t/ ~( n0 h
- , m% ?: m$ v9 y+ g
. v6 A6 t9 w( f y# `) l, P
2 E, J8 f: f, E6 d6 ^9 X- m) e: u$ d8 z
, o, A' \$ w/ p, @3 A$ S% \- $ \9 o+ b6 ~0 J. |& c0 j
- 4 Y0 |) z: e% i* Q6 N9 P
( |" U- t6 V2 n6 d! p; ]& Z2 {
K" ^ j( p5 S) I" }0 V9 p+ ~
! r, Q6 d. k( x6 A0 L6 E0 X7 g- / U2 U3 V0 [" g. y$ @$ }5 t
- $ r5 x1 {) h2 X |, Q
- : r- n' d3 f6 G& E9 D) `
- ; o* }& Y8 h! \$ e% S0 q; K
* \8 w# i- J! h: i* y
! G9 g# z1 e& l6 t; Z2 ]- 6 f4 B- E8 |! }3 {" i
0 h0 _# l& s* T: b: |; P' L) i; y) U& 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")
3 d" Q9 f; q2 D A + w. J' I e6 R" I& A+ q/ N3 v4 Y, |
7 U o' i2 U# a: r例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
0 P! a, K/ c$ @0 j, |; A
/ N+ X8 ?5 ]$ F- * |# B2 j5 k4 u. t: U0 u
! S4 ]1 V$ i0 A' _- ^' r% u! X% ]+ w- 7 w- ?* C, s2 U) X+ Y
% b0 p- d- L1 N! x! V- * P2 E3 [4 F( Q& T; q
- 9 }: ^3 }% n4 Z8 A9 S' U' h
- 8 S# H `! C" ?5 G; M
- / P: {. a: C9 {. a6 g: R" W
- : i s8 a" O8 F( `' k
- ' ^- |) [. n! T- ~
$ O/ {. B; m3 b# ^& a9 s; P- ( y2 N& L ?( z
- L1 b1 B T. ], o! Q
, _/ {7 X4 V/ H3 y! P$ M2 n
5 n9 I" l/ D7 p$ [8 |- , ]# ^+ E+ K4 _/ ?" [& J0 t. s
" Y1 \9 ~4 S: U6 @, \
+ A6 d" ~+ j5 C8 e. E; 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")$ S' G$ X0 I9 G- j) w
3 X% c4 f( I1 R' O7 B% {, j
% P/ ?; p. r U$ U- Q例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( Q/ u" {8 v$ `% B2 u- [9 E$ 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()( a/ N) ^) W3 j
! p" X' l/ A/ `% n4 G/ o
5 e) ~# z+ R. r3 }( x! f- P3 i3 S: m例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# k: [$ Q, K, s) |/ X+ z
: a* a4 O' F+ g: W1 ^- , C6 V9 j" V P' K/ | B
- ; _9 J' |. d+ R
- ; n/ m( w3 A( E: r( O2 o( k
- ! |& E1 O: `* b7 O# ?
R2 P* w6 v' N. [5 [- 9 M: a6 V" I" [. Y& Z2 v
6 a# \$ R u+ N9 ^, |/ o
0 R* @: M7 g: F: g% S+ {& L- + D4 q4 \4 g( X0 t. a
- ! j d% d! M5 c! S" ~: u. k
- 5 ?# E9 |7 o; z8 F
* z2 k, n& m, u1 L- 5 N$ P# i" N) P" h. {6 \
- # Y, @) g4 M$ J: _! l: B
C3 `! Q* D- E0 v; x1 ^1 v: v- 2 {7 _1 r+ O L
, U2 U ]: O! H! |0 j* I; y+ V# G
. ^0 N9 ^8 @- Q" G
& T1 c5 j o5 j1 a. K: j* `/ K
% P/ |1 ]: n# W" O% E) G
. S$ |7 B' I1 k. |" P2 r
9 V- W- [) E: Z- ) \: ?+ F$ Z+ g2 u4 r o* t5 L+ n
8 E- y) K* |; K$ T% d$ x* R N1 n- " E2 y5 C, u- q9 j& Y6 O
3 n W! S) p; c+ Y3 j) i7 f6 R- - W1 W: x. o2 {7 S8 O
2 L& w1 j" {6 M3 F1 S
2 g& i9 U( _$ u4 q! A$ ?- ' w( J) k4 q+ ?) i& c0 j
- $ S8 y% T1 o% @+ q/ K5 }
- * {0 j' r2 C3 q$ d
" ]5 b7 L- W2 ~& V( |6 W2 N @2 D0 ^- / }$ |( d2 n. D8 ~" @4 O8 h
- ' L. a' R1 i* S! A5 D* C: T7 H
- p! F% M4 W( H" A& r- ?1 L+ N6 o
/ [$ y; H$ A( {* K3 r" K) }
1 A! d! [: h3 t
( I% }6 |$ U3 L8 h* z# z, C, J! w1 k
! x; c L( Y4 I$ o
0 g" r) @5 L* i$ w
#例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))9 ?9 M, X0 M- {" x9 L. {
5 M% U3 P' |1 w& D, E! G/ B& X6 m! p例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
( S- a, F0 C. F# F- - m# h Z v0 B+ l5 r# J
- 6 Z& K" s& W/ E; F* |9 [; c
- - h4 W+ h& r/ s2 K7 Q
6 ?$ C' _" X. Z0 z7 {& Z- R. d' R8 Q" M# K; k
0 A& V* m; p# d4 e! k- ) `8 F1 X& F$ ?$ ?( H8 q6 {' j
- + \- n/ }4 ~: N# f% S# ^( v4 n7 \. `% R
0 {! ~! \8 ~+ B
& F( U; W6 _# p* m. A; [- " Q m Q, Y9 I& H# s
: e3 p0 [% L: Y9 L! E- N
) F! P* |- O! ^8 I6 _1 o- ! |$ B9 G& z3 V, W
- + W8 P# ^7 {5 [% }: |( B
. ~; a/ f9 O4 C) t$ ^
, [$ N; m% b: y. [2 V+ C- 7 i; i4 P j5 A0 x8 T! Q& T
- ) G q0 f {* {& T, @6 k
- ( z9 O/ E6 |7 Y) B7 t% m
G1 s( s2 {/ E# g( X8 J6 C
3 b/ @& p8 W7 i
+ f* g% ]7 I' H5 G8 r- + j: ?5 z0 u; U) A+ M5 m" q
0 p5 K& ?9 v8 G* ^$ ?7 ?9 o3 G/ m- $ O \; f+ n0 y s. D
: ]. G% `5 D. a- 2 J4 W9 { y5 A
8 a# }9 b. D* E1 L" {4 c4 I- ' s; i, h1 k& _% d
$ `5 j0 T! V8 l4 @1 k/ e/ F- / y0 L b: i( c3 Z" \0 f" S
- 8 S/ u) l9 [5 U0 T9 V# J
- + l6 h$ h; i& \
- * P ^/ p0 p6 x- ~
1 d- H" x- X6 z% f1 ~8 S% t- W- s6 S/ ?( D* ~' _" ]
' |% I7 p/ Q, j# v$ L3 w) e( Z
7 F5 `/ m; `1 M& w4 c
7 ]- t/ D5 D4 T$ e1 a* _
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))$ p* g6 \- l C7 u- O+ o, ]) W( l
( e% v9 T( y% _0 G
- |. Q$ \# T& L7 k0 \" E9 n h( T颜色表:
8 s" z5 u) a6 X# d/ |& p
7 v" d1 {! x4 x# O0 S |