|
气象数据可视化主要依靠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("···")
/ m" ^2 p; j, N( M7 v3 V
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( v2 J& U8 o0 T e Q5 X% S- 0 f, X2 \: R+ ]5 T2 |8 K" v( u
M9 k/ `/ @5 f0 s$ m
$ r7 K; u. J" E+ Q
* a7 z9 D7 o, A( s' i8 C$ {0 w
; l% i% u$ [' _
5 L6 E. S/ s V7 C* a# [
0 l6 Y5 w) D& _" P- 7 p, Z& h3 `9 w M. l
- - a8 O2 @ A5 @5 x4 Z% e
- I# g5 P$ a/ \
% L. B# v, R6 F: I9 B% ^
6 ]! W# o8 L+ D- [$ p: H% m z- ! {6 G$ ?. P; s/ j
% x: A6 s7 d/ ?+ g: F- - D5 z1 h8 Q3 J7 A' N
- - ^6 U) _# V, O: s6 d3 i
/ T- Y$ H" P# g9 B, Q5 D
; G& D& @$ z- f- E- + t6 {8 D) N" d" D- b2 K8 r
- 4 ~; ~' n3 ^; d Q7 x
3 D8 S+ \2 R* ^: S$ T" u+ O- ! z' J/ F% A8 b2 [1 l% v6 o2 `
- $ O/ c. U5 y, V+ T0 `) f
- * \# n3 V3 O* d( V9 R7 K
6 U% S% Z7 Q8 a# d3 p
#绘制中国区域基本地图轮廓,包含省界#引库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")) q9 t# {! _% G* ?* C6 _
7 _' r0 |3 n" M5 z: ~
$ _% Z) a1 V6 ^( V; \* w1 ?
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 Y0 G/ I% H+ R w) R
) I8 \* m0 A7 o5 C* y$ \0 n; V* ~$ w
o M) A, W9 b$ b9 @6 U
: a9 i( n8 s7 F6 J! z- * E6 Z7 J9 O7 E- w
" ]; i) i+ d6 U+ o% @- ; H* ^& v4 o e/ Q7 x+ D
* U( n A% g$ m% {4 t8 [: I% D
6 {% k2 b! ?! F& Z& \- ' N0 P% a J, u
0 Z$ W/ z2 D1 W4 J2 N9 b0 f6 r
b1 i- R2 L' S& b6 U# b
" t* U4 q; w4 U T* \3 d- * I2 c' }/ F0 [
- " S: W' [" A0 Z
- % L' }; h5 Y) I; N/ J
- & S+ `% R+ s% e1 g
) V/ @/ f- m4 b2 M8 H5 z5 X; ?- 9 p; J# b* |8 A& S; j
4 N6 R1 X; J3 L
#绘制中国地图,并标记各省会城市名#引库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")4 ~) u2 ]( D1 \) j( C
( C% B, s Q; w. e- Y" H) |5 i- D, |& R- O: `6 L
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( ~1 i: U. e: _5 I/ A
##绘制有海岸线的中国地图#引库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()
. W C* ^* M% d1 o ; K6 w: D7 Y5 t
: ]$ `6 C4 ]* S7 u例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 r( M4 R' x8 g& _# p v2 D
- 6 {# A1 l$ B, p
- 4 Y& W$ U/ q6 J, o( Y: o; I7 @, n
- 4 V$ W6 r/ g$ X) X) v
' [: L. q7 f- v7 ? r
) r# G; t4 u6 V: N4 ?2 ^- ) v1 H; w; Q! {' z2 S
# Q9 E2 y' K8 s6 S, F: X% z- 9 Y8 J. t: m. E6 t& s) L
}* |( s# ~( u: e5 k3 `( u! J
8 ?+ Q. m7 b( U* ], Y
) W" `' w( f7 \5 e$ h a2 B- ! s* e6 u+ |1 D0 [9 l
- 0 U/ Y. M) `8 m
- 8 f9 `/ @$ d$ V: U" o5 x
$ K" K0 E* B1 Z; w- * Z' a( B/ |; ^) H. z& _
# @2 B I( _! B- O6 r* |3 [
, M4 X3 l! \3 E3 V) K: c
6 p# x7 x5 I7 x9 F1 _- l6 I, ^
* j+ L3 ~( M" t& v! `' I4 Y
! K1 P9 E2 z7 F; u. i1 V- ! {, H) v8 l: g& ?
+ v, @$ G; O) Y+ i# [/ N
* P9 L7 M: W: a3 X, U- ' l6 p5 p4 B, P8 U
- : G$ _/ C; b9 J. `: o6 p' x
- 8 s9 o8 t. i& m: W8 G8 ]
; W! \- ?) e- O2 `/ \- ) ` }6 t6 W8 y
2 m1 G- x+ U$ I; b5 `0 {3 c- ' t" w6 P$ E4 |9 H0 R
- : u+ j: a h% g) h, w" h! w
- : S1 `5 C, @' Q7 u3 t. }4 N
- 4 T$ q g" G* F& `- k# G
- " M# i7 z1 k+ d
- " e# k9 B/ R4 [
- & u" q7 t! _$ y8 Y2 [' a% L
- 3 H! Q b$ P, _# u! N: {% p7 T
; A# q9 _& H4 L* T
1 {: d* R& Y; L4 \2 k$ v
/ G5 e, ?2 @; H( t) p! s+ |
! s0 g& }: e! c
#例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))1 c/ r% G3 @0 n6 Q0 N
$ R! Q: x1 V4 T+ f7 p例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
3 _) Q! F& E7 w& X: C2 I4 B" P3 ?- $ Y4 d$ n1 l \( m0 d" b. V8 {. \ d
4 `$ P; C' E P0 o6 M
- P+ [/ J' F1 \. O! e7 c! F3 ]8 ?- ! z' d# B0 L1 q$ N5 l- q& D
- 1 |8 m4 [( G! o: L- F, F
( G1 s9 o* R( `8 o/ ]: I' e
% v. S2 ~* I8 Y0 ]" Z- 6 X5 R1 O* z- S" K, p
- + t5 \: j- I0 L9 _
- % w) v/ S- _' q) L ?2 M( e2 P
- . ?/ Y$ A, D8 D- s9 B& M
) ?. Q# n2 ?+ `; s8 _, Q- 8 k. _ P/ o' T" l0 t+ W( y; ?
- - ~9 G) T5 T2 y! j9 g
- " u3 T9 u; \) f! m M
- . l3 C* `, n% e9 I& B* f2 L( D
5 B0 @ S: s( u' D- : l1 U$ v N" m/ O: k
- & B e8 f, H3 |' ?* o G; q
9 |- k5 W5 c k4 u$ t1 H- 1 _5 x- N- B4 M p0 w$ h% C* E& Z- b
- - R0 [! c. t$ ^$ \, D" D4 O# c
- 6 `- G# X- l W- C! E. u9 I& v
- ( u0 R4 n( \4 a! w. J7 O; T* s7 U
- 4 p- P: a/ l: X* b+ l' y4 I: w
- 1 B) |$ l% W, K% y( N* W U
- 2 d7 V: R' c0 L0 @9 y7 T
- 1 k6 z6 S5 p4 d+ @! v ^) ~
' k+ g; Z3 z" w1 A5 V+ S( J
: H8 U T# U! y8 t9 f) A" a
8 K @) i# F! D' ~1 @- 9 l" \8 s: R8 @2 \, H3 g. o
- / Z; Z, E2 V6 @! j1 R
0 Y- m& P' e9 R. r7 V) k- + H J" ^6 \- p
- 8 l2 Q7 y- u! ]
- . N$ K; _( }, o$ S8 g% o
2 b0 m, r6 l2 k; G; O, r7 O. r& C- ^
9 T9 O, p( z8 b% G; N; q8 v' Q0 D4 H) {+ A) i4 L. \+ d1 K
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))
$ Y- i: `: Q7 g" F: `" e7 c# J + |1 E9 B, F0 {% _" z
h1 K" o; ]/ i; ?颜色表:
. y8 `& z" A1 n/ i
& r+ c; S( W- B {. H |