气象数据可视化主要依靠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("···")
/ ~4 [. F# o+ C* z \/ g/ F
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 8 V4 M7 V8 y, m5 @. ~
- ) ]2 U6 u2 h9 y( J$ ~/ [4 {
: Y' f3 K" q ^2 a9 u( X5 R) @# h
8 Z- |2 J ?1 `8 s& s- 2 ]2 I. q$ v7 ~! O$ w
- 2 x6 ?2 l+ G. @; L" u- ^% N0 j
! @, q" \) m+ ~" @" ]
; k" b6 Z% J) n G- : {& e9 i$ H9 j" n% q; E5 |
5 |( e8 L' E1 Z" F e$ Y
, d: L/ L! [; G5 H' b$ K+ ^4 n* Q
; A" z/ p6 M0 U1 f1 b
* H, ~) T! ^3 w/ p3 [+ [- ; @2 v8 _8 i0 N8 w; c, _1 a
- " N% Z: h, o" h7 S
- , L+ L$ O3 i- t( ]/ r
- ! A- v' h( T F$ W$ \$ y
( n) g# A5 ?/ o% v- & q# C$ ~5 `4 v6 ] c
' h1 ]* I3 j) S2 z
9 V8 l8 Q& H0 ~! d& L; K' i- 0 _) x2 }+ [5 S$ Q
- 3 d+ j5 m9 a$ @8 `7 a& o
- $ [* h* o# K: d7 x K% t7 J
- + L+ s5 F+ r# N v# ?+ G( A w
, _$ Q4 T8 M* D3 ^$ ]
#绘制中国区域基本地图轮廓,包含省界#引库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")
( }5 I9 _* P8 ~# J9 g( X# _$ G7 O3 Y 0 H: ?4 k0 A+ m2 M2 Z7 X$ o
: y6 a8 Y6 Y% }% D7 S1 I# ?例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ M+ m& I2 f; O; T4 |7 r5 v! y
- ) o7 \* C: d4 |7 P6 j
1 ^. Z; q5 I* B! U& _
: p$ L& }6 o; l! `
# {5 c$ p, C3 V b' o- & q4 Q% x# r0 P0 U& C- C, U1 J
- " L2 G0 I3 s1 ^, W
6 N% R3 f5 Y- I% W9 K/ X( Z/ O' L
9 }. d' `1 Y$ n3 _9 d( {) S: J
$ ?0 f, s0 s& {# ~/ j
( M4 i- h* ~7 t- N3 N" P
/ } J5 r# |" Q6 L
6 i5 d! F" h' Z9 u* H: y' O# u% T
6 c" S2 K$ J- K1 f+ Z- , V% n! ?9 N# l0 k
- 3 U; w) e; T0 v: x! b& w
- # O/ S, R! l" D! S6 q
! w" k0 ^2 P" U0 H* W
6 t0 N K$ j& J. e2 D: N' |: g3 Q" m' b- B2 I9 u& o6 @
#绘制中国地图,并标记各省会城市名#引库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")
' b6 S3 ?# F1 c( e+ O2 l8 Z % |. }+ D: ]+ v U( }( S# f0 y4 c3 W
a# z1 b9 Y! l. S0 `2 n; h; G
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 {2 M9 k# }: N& g* u5 a0 J##绘制有海岸线的中国地图#引库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()( E' q9 b( i3 g$ U7 y8 j
: x* |% I. {9 [. r7 o
0 \7 q, }- l$ c1 ?例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
: T8 S$ |/ p8 X, Q* M9 Q: U2 _
- 0 o) ]& j7 [2 ]' e
1 g7 V0 Q4 [/ Q1 e7 U$ ~! t- , M% U( |1 M: a9 [1 n. D. o/ M0 `
3 {8 c; ?6 W; J' |' m/ C) P8 B" F- " \7 F8 r: G: ^* i4 l- V Q' m
2 a2 z3 x( D; F! o7 m+ \" p! j
1 t2 G) ]( |9 U5 R$ N- " G# ^+ ?* t/ k) ?
: n; U! ?( S _, J+ M2 O- , z* t4 p' K( K; P1 ^
- 6 e @" B/ q; b ^% A
- 7 h+ m: o, E. `+ y: `
- 2 f7 U6 x' d# L- X+ \8 _* I$ @* q
- , H; P% Y1 R0 r' F2 f4 d' v
- 8 `, m! q0 ~4 P# K5 f
- 2 `% s% m! |9 Z1 e6 _6 i9 J
6 E9 _- u; M5 A8 C1 i- O0 |! C# I
4 m% i( s0 g5 d4 S2 C9 A' G8 b) N& `
' `5 j5 V+ [5 o" K$ a8 O2 [- ) Z8 M3 M3 s; h' s
7 e% M* I' l: u' q- n" ]4 @
) m7 Z0 W$ y$ E7 G% y' K3 d, j8 `- ! E9 b/ ~8 u6 ^9 x% J! | c
8 }6 b- ~6 K9 m7 T, f8 m4 U: p: L
& F2 B% i; d* L# z* G) H- D; V D- 9 P4 R2 t" `; u" [% K8 L
7 H$ c# x0 Z+ z' x$ f- 1 {; Y+ @5 i' l) Q' Q
- ! d/ n% ?" ?' [2 t9 n- G) G) N% \7 a K
- 6 p' S, d# x9 x* o2 d
3 j: O& \# D6 t* a
) A* R, R) A9 ]+ R( M+ T a' C
6 y5 f& u; ~- T# i, I9 P- 7 R6 ?5 [8 R7 M# g6 @. ?
/ ~) g' m) u- L3 {/ E. W
8 Z# N$ y/ v: V- ( X$ Y5 h/ g' S; T) l% X* L/ `
- O* Z W7 p8 [6 ~/ A% |" }
: c7 g0 n/ M5 \4 N+ h7 W, i: I
$ I* M: R+ y$ F4 n' a8 g5 f- 5 [( [6 O' o! E
% }+ n0 e" c7 B5 R
#例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( g/ W% t7 M, l2 w& V$ P
- P- X5 }* D2 e1 H' D& Y
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
' Q+ q5 A, O) j; R/ x% I$ l+ w: \- ! j% L9 ]3 ^$ z# r' o
' r* J1 R1 ]7 C( Z, M: d7 ~- - h! p% R w, I7 z/ d9 e
- $ P# `& N% v9 p+ p! o0 A
& f4 s2 n" Q0 T2 `3 @0 i# a0 H
9 G, ]- w$ i* D- & F$ J/ Q6 n3 O5 R( z7 s; p/ F
- ?! N5 J B( D0 t$ M# F) T- . y: j& U: e: u+ s1 s B
" G$ A3 s% D( O5 Y- + c' T6 K" E5 X0 B$ _+ K1 Q
$ y9 |& J. r0 g; P
8 v% C/ {% z0 v" T# K" b
1 N( ]0 Q/ `( u# K+ [- & _) s1 H- }) ]$ z9 t, J
- r! z' m& N3 [1 U, H- N
- 9 V# ]# v/ }2 W' i3 M3 l& C1 R
- 4 ~ q& s" x O- v
- 2 f% Q5 f" V. [% G! ~! L
- 1 M. B* g: V& K; K5 D
; c( {( }: u- U9 T$ X- * j# ]7 F+ M: ]4 s$ T
- 6 L9 V" O7 J: S: f+ G2 A
- 3 R2 N- @9 J5 q# K
. n; D8 N+ [- j' L6 \$ ^
1 L; e& ?/ G& p! {6 X2 d
! C( \3 S" [ o) l
4 f9 m3 r8 ^! i- 0 o1 m/ T/ X9 J/ i' ^7 W/ y
* ~6 r$ q9 p; m2 Y2 a- m
, _5 p8 ] x% @' e. u; d5 ?5 }- ) Z6 d1 U1 c& P0 r& s u3 J
* E) U7 x# n* L( U
g, v/ K& V ~; n3 N- / t4 b! T1 H4 R R% P+ w/ {) k' J
1 N+ n7 k2 L9 l' r9 @$ N5 R* x
, \9 [* M2 N6 t! s" P, r" B) O% i- : P. I" Y8 }# J, s
8 C+ ]( ^: T j" S: u: G2 _# \- U! q+ X2 _% B$ 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))- Y! n2 d- O, n
, F2 e- o$ Z" {- O2 v8 w) j( Z( E3 o- x) q g- `. I
颜色表:
! K8 F9 s9 a/ j8 B. y+ F3 L m- K0 F" J& q4 S
|