气象数据可视化主要依靠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("···")
7 Z5 t4 o5 l$ j
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- 7 K. j5 n% v: D+ }% K6 y3 n* b
8 V. v R9 k1 s( I" B9 u
+ W# w$ X6 l6 J- v- F% U- 6 T4 W" K p+ c5 i+ O* f" c
. u' u% g7 b2 A# X. w7 M5 n+ u
# X, T8 h- w5 V% v
! K, Q' g; ]* b- 6 S* G# _5 I+ t. T; Y7 {
5 F( x( m, O! y! R2 t/ m6 c9 t% A5 n% t+ z- " W ~9 j; }% E! o |5 B
- 2 V, D) {2 w6 E, f$ R o- Y* _
t; [* {# H3 D6 w' g( t1 }: ~$ \- / g9 R$ `4 b$ ^1 q' W, t C; h
3 @: J' C% |& r* U6 @' D' ] t1 _: o
3 Y8 g: U- v2 Q+ y- / |* M* l# ?: y" c T; ?) Z5 o
- 3 }/ N/ a9 r1 W! X: n$ l
7 c/ U. D8 r. W- % N$ b) c. M c
- \% |7 v* K* ~, | G2 T* P" X( b* b
- J8 h2 B" O! d% O/ J1 \
( K3 M7 s0 Y& S/ T. ^- % X2 f0 {/ A' U( `
6 ^8 @8 u" H4 B: A- , G1 X! G# W3 K! o) b* f$ ?
" M9 n& T$ i5 @
#绘制中国区域基本地图轮廓,包含省界#引库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")
( Y0 j# J1 ]' L0 N( m# R, z6 }
6 S2 r y1 y: p: E" v9 A. {% H! |! Y6 P/ S! J( Y
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# ~3 h- u' B1 n' y! Z$ y
: |) N9 k, Z5 S' n- A- ; i$ e$ Q% }. h* i% |2 I
- , @' u g/ j5 b# ^2 r/ W6 Q- o
: o8 t% i: ^ |: K) i- 7 u1 Z5 X1 \" ~' \: w( p( R
- 9 o2 {. a2 @8 R6 ^% _8 N2 A
8 x' m' v/ ~7 r) B
, R" `: [8 \0 n6 G/ t& I6 T
) ]* A0 ^- ]- P8 n( n- . ?+ Y( g, j; e! Y& \: N
" a7 P! S0 I W0 l- # B# S; n/ B8 z- D' j: X: F5 |
- . t* ]9 {, w* T6 p# \
- " M/ r2 q2 c0 [/ ]' K
- Q2 y1 F8 b* y2 v# U7 p- ' C7 `$ q/ }3 Y% C* G* a5 E
1 b. e) o% B5 U+ f& B
7 C# c9 j! A3 R, K. |( W7 D
" I5 I" m& a% \* R$ T
#绘制中国地图,并标记各省会城市名#引库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")
, E- g; N- D8 A# s5 ~& o # S0 P: b. v/ K
, N1 D' g2 h1 j# `$ r* `8 m
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
8 }* B$ f- i/ y; g3 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& v" G- x2 X
& r4 S# l$ _! `) G# W0 H
# [% h6 V2 c( f例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
7 u) j+ [8 u/ o9 N' r' ] N
/ |# [7 w2 \. X Y! L- _; c
- m$ e4 W5 I8 Z+ S
% H- `) E6 y h9 a+ O7 f
' b! Y& l6 c C1 S" Q! ]3 e- 6 Y) Z H3 Q* ]; R
- 1 b# R' F5 N9 x+ p6 b. W7 {. B
- k/ {, L, y7 i, X- }5 r' i( l- ! b0 o8 N2 b" ^! |
4 W, F* x4 ^/ t. C
" w. y: S | L
) Y# p) @5 n" ]. A1 r* k
/ t K. s, Y1 J& ?. i8 k" V; b, ^
7 {, J6 i; X- J. c
0 u/ O1 S6 D- T9 T6 y/ S1 j3 G- t3 r9 l& |2 ]3 {0 }1 H L
6 P# R' c! h. `( c: @& j) N, j" O
8 n( t: \% s5 S" k- " f3 S: i4 r$ x4 Q+ U0 k
- $ L0 ] t+ J1 F( w. x
& z) Q" l% ^; i5 e' ^. Z, h
# j* r; M% a( ]+ ]; l' I, f
( ]1 K/ O- A1 S: {; S- 1 M# s/ L3 o; @6 V3 x/ Z
8 \( Y7 e! S3 P- , d8 d# L, P8 G* r5 ]; c+ s
6 k }1 w X! a( v5 a
: o4 t. J6 S" ^5 K- . O4 D0 U4 S t. ^, @" Y" F
, |9 q9 B3 J$ G+ `
8 O( v+ L. y* N3 z( o
" Q" f- U/ A f4 l' k* H" }, }- ' g' [. Y/ o% Z Z& h
) P+ k- p: D6 v- {6 C y
: M# c2 K% j2 m
9 \$ K t9 f/ y; F0 u! J
. W t! m4 W. w# v- 9 a3 ^: y2 e, h {
8 @, y! a) V2 m8 u
& w" Q* r$ O$ s: I5 S1 ]6 u- , e8 P2 n+ `; {3 d t
, r8 I# {$ P( v7 M5 ~) c
# G5 x6 a& o/ r; i( s- o9 H
#例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)). J, W) O. M# f* k2 g/ S. |( ]
+ D. k0 {3 a6 U' m例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
) R1 S! ^- T& C# P5 ~' a8 Y- ; }' @( I% \" E* H
7 V/ Z& A# b+ T3 A- * g* d& ?0 K1 a" S% e& O0 N, p7 C( H
i" S: z+ X2 u- q" a; G" E
c0 k, I8 O6 A. J9 m- " h- t7 l0 B4 B( L) d# O0 D1 H" Q
7 t, P. q. s5 V1 @3 p$ ?5 a7 X5 A- 8 x! a) g* x3 A: X
- ; d9 a9 f$ C# i
- 7 m4 ]* l& M3 M+ h; H" k
- " I' R W6 u# p+ \5 t" @! S5 ?
) L+ q" g$ Z6 E% h. H- 6 {! g* j" E$ Y2 u
4 k6 Q3 E6 P* f4 I/ O
V! L: U @8 @+ l& H; D9 t- `! _6 D+ X5 S$ ?+ Y
$ k' C6 }6 Q7 i- * Z7 J/ K5 Z( L& O, K9 O) I
- - \3 S2 w, s0 U7 R0 i
- 1 \+ c, M& O9 l0 g! c+ J1 f6 |! ]
3 a9 C1 R* Y @" B- G, a+ @- 4 I, Q- o' N$ Y6 {- H% y3 P6 |
' u. N& u, @6 e+ N
$ ~- |' S; S% l- : G* g9 o4 ^# H- v3 N' i; x+ L
- Q! E9 ~$ J* Q' ]6 f- t) I
7 A# e2 E1 @, u# M, e+ f1 n7 B- c- ( Q' E+ _" E8 v9 S
$ l# L+ @. t3 G( H* S$ ~
5 b% } l2 `, Q% z; k- 1 i1 [) V: p( ?" c$ I/ }: ]" r* L5 n$ f
0 j) V y+ D, h) r8 T- * N4 L' M! \& ]8 N+ ~
- ) K5 O+ e$ [0 f' H& b
- * H, W5 K1 [: ?/ A. _# N3 u
- 8 H. U. |# _5 v' d$ h
7 o3 k- M5 K& i8 Q
" n+ P% p4 u5 ?; V2 K
6 n' C: c; h! T+ U* f$ P8 o# J* c. s f
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))/ Y4 w: x1 M' ]5 h+ h$ k
- e! G5 E% j y- e9 T: f* x! D' q
7 K% S/ ~( O3 @" T- L% J$ L0 G颜色表:
}; g1 P; Y+ J& F( @" j6 v
! ^9 f6 q! B5 C3 f" n& V6 J$ ^" x |