气象数据可视化主要依靠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 @# B* E; P' B& O
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- / k$ I o3 S3 ^) S, B
. F' g% \9 g% u7 d$ N
( Z. V$ x# N' ]* M5 r) B( ~. M: r
; j+ g; X: r! Y; T, u9 z7 w4 Q- ( k, M- u R* T( K1 `, {; K2 U
- 6 e- Q. U( u) k8 S, O, a) R& }
4 W/ j- b6 j- }1 f! Z% O3 O- W& m l6 R/ f& X2 ^
- # \ j& V8 ~- u, g" w
" w. j4 s8 @4 k3 U- " P) R3 ~3 x: _3 D- Q
4 u- ~( U: ?! \; L- 3 [% p& j2 p! m9 q) `
; |) W% [8 e! ` Q/ Y
, u7 h1 i/ Q( G T6 b
2 K0 V# q: B# w. q' d0 n% Q. x
* _9 L7 X2 ]+ [& \" R- 8 m2 A4 ~; j2 Q2 [
3 Y& F9 `* ]3 U* {! T
) W2 |5 \) q6 Z3 G- 5 K4 Z$ F/ d0 Q" B
- - e3 a$ r( W: y" |- k, L; N+ u! L
" T$ q1 B. J' ~) N7 G: Q8 y6 i8 L* a
" C0 i) J. ~; s y' Q( e
) G$ [4 O4 v$ e: @( _; v. S L0 @' _' v% E! R4 S
#绘制中国区域基本地图轮廓,包含省界#引库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")
6 {- z; N5 Q5 L; x3 O7 X/ H8 F, m
! X2 E, g. k, _, |0 q% G: F0 K; j8 t! Y
例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ _" z9 X1 |8 g
- $ `" E0 c6 F; y% b& ?7 u
- 2 m- d5 h. t5 i( ~% S/ k( I
9 } H4 z& M6 @- 6 @ L. ?) n: \" m2 U8 P( \
- ( \; c0 [2 H. f! L2 m# @8 o( P
" C$ N7 a& s6 Q5 S4 I2 o( r* L
- I2 J4 A' ?- ~/ n& w! t( V& q- & j& u+ s! x* [, l: J
- : U$ q3 t' F; e7 J7 _( W
- " X5 |, {$ g% h2 o
- $ j2 ^9 U- ^4 Z
- 7 ?1 h, p" o0 Q. Y
- # x6 z; Q9 p1 I
- " v6 `6 ?( K; }3 g1 D
; z& w% f$ ^9 g# { `2 u- 8 Y2 Z# x: J1 B
8 G; M( c0 [4 G; ?$ b* _1 s
% c9 ^& ^' i, T" l
+ q& n- r, X6 L$ _% q7 n# |
#绘制中国地图,并标记各省会城市名#引库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")3 r' Q3 { G# u& S0 `
* M6 l% ~. G3 v ^! o' e
! O/ ~' z, g% `) W$ r5 h) H) _例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 G/ k; d$ _1 t- ( I& k2 i0 V5 f2 o0 j
- 2 E' s1 g9 n8 {8 r
- . V0 y4 s/ C! `0 D! u
- 0 F5 ~" k: m; b4 y
- + s6 r( i: a) o% O8 H! t8 Y: k
5 _% v2 B, Y- j9 @2 b- 5 T6 k! Y3 I( D, c/ H, Y
0 c% P6 H+ W: A+ I" Z- o
) T+ [9 r! n [! _& \6 S
/ b2 e+ @8 f, H+ Y5 E- 8 ^; s3 p- l3 c5 ]# L$ Q( k
- - j; {: ~9 z. T
- - v) ?+ Z- w) L0 T- R
- $ K! P% x1 f* ^, w6 V5 ?
3 g% H T: g9 R' |7 K
1 U+ g1 l, O2 t6 A3 Y8 F- + |) A; q5 z' _" w I) U% P, b
' t M1 P7 l- K/ M: s7 j! C
( U4 @' `% `' Z- . U; K9 u+ c+ V. \4 ^ {
. x% q. b5 }! T- 8 _" Y1 {) |3 M4 `
- ( D! D) |# y- v
- 3 W0 d! L. D4 E7 G6 s
9 Q, Q3 @8 [( n& a+ m
' @3 x- p' D, W2 |- ) E- q4 y# ^ `9 v; F" ?
B7 K* N, ~" ^
$ k, ~9 K2 V% x- . W2 L$ Q' D! \1 S7 {5 G; v
) e+ f3 P1 P& N- @- Z- {- n9 C' e& a$ `( p8 q
- 9 g/ O/ ]) @/ O' V
6 c! ?2 r/ P. g X+ \' Y7 q- - I9 Z4 ~, v- I: Y- m4 P& D) u
. x: z) s! X. A8 z( o$ h2 v
+ F7 o2 C: p l- L* I( ]- & [) T$ |5 L) E
- # a7 l; k+ ~9 W x
$ z: ]& D8 Z7 G! D8 Z+ H D4 a
! d9 t4 k, I P' K2 n: }
. Z2 t6 p4 M5 u' V) l- . ?: Q9 E" l2 y" T9 l
- % @- \9 @' m8 U4 E4 O. x, I
0 ~ W. A& l% q
* y. b% M7 A: O9 `; u0 k
2 S& O% Q. X% ~5 r
. I% r; [% |" j$ {1 ?1 B! _1 `5 V- ; i! N6 T0 H0 `6 h9 P
) q3 F9 X; T+ B( `+ s3 M6 q- \- ' b/ r; M/ p7 Y9 |
* Q6 m2 K* d1 q1 n+ F
##绘制有海岸线的中国地图#引库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()9 Y' M1 i4 ]- W+ _' O2 C6 B8 ^4 @3 v
/ U5 B* r6 o- I; ?9 v2 g
Y, H- }, B% E* C& v! r- ?例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
5 v" s$ c# |% B. Y3 a
: o/ f2 ^1 M% b4 L! s9 j; w+ @% U
4 J8 f ]1 H2 H& C, ?- * R! S3 ~1 O7 x" ]. y$ H4 N
- ; P5 l! Z* w3 r, ?: u; B
- $ u( J: j, Q2 D5 {# n6 s1 j. O
- 4 V0 s/ W% N5 x- ~
- % z) {$ u2 C- Y! r8 l8 `+ `+ W
- : x$ _6 j! s# a4 f. \
- ! E' S6 y8 B3 D9 e4 i$ i- {
- 6 \$ e p4 B5 q$ {, e3 ]4 G
- O/ U4 c# r$ T$ V
& X9 }) s/ A; a- |4 b( R- / v4 d. `$ G6 h9 h: P, `- l" ?
- , z; G5 r5 o- b, ]5 A
" y! f' N6 @2 h
9 L; w( m8 M4 q$ b+ k
G0 G# f* d P5 }7 i: f' b
9 c/ [" s( q4 ^- ) [7 P6 R4 w5 _: n. Y3 J$ W
: d5 l# n9 g5 r& q" F
3 c5 m/ u- X- V9 h, g0 s
9 C+ E' z5 b( ~( u
* R% V0 O3 W- i$ F2 l5 V8 Q
$ x+ j' X: d& q+ E& O- 1 X: U( G- {+ ]; w' W' Z
- - C+ A! g! C! v
- 7 P; {1 ~ F( i0 Y( A
5 M5 T. W' E, H! y9 s9 t- Q
, g1 I+ p- ?* N- # m! @1 Q" Q8 J1 X1 R
2 N9 I Z/ Z6 x! Q( d8 v
% f, S# f/ G! p, z% `. [- ; ~% V0 }6 K% T( u1 M. J* k; I
/ u% X) s9 m3 B1 y- ) W7 w4 I( _; K$ U% R3 L
2 q9 g8 M2 A1 W0 a/ n
) N4 J! x& s* D# }5 x* W+ z$ S
8 s& {+ V3 Z7 ^+ L- $ E% h, W! d/ F/ A
- 2 i3 u1 L" H& D, P
$ o" C+ `- h) H6 z1 d9 D- z; r
, d' O- K- @% s, s
#例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))
! _* ?2 I3 f8 {6 T1 O ; ]. \) a8 c' W' a- T! a
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
' e, @& l" X# n& D+ y" A+ n, g
; u- E9 _% ]# M0 d' Z( R- ' Y! R4 R) N0 h& S
- $ b" a: C' [+ }7 b
- * A. S: Q0 k# k9 Z/ t6 ~* B
. w" y' s: K5 m/ `
9 d1 m+ \" j2 U! \# f' n8 F8 ^- 2 a6 `7 f0 W( U1 C. ~0 q
- . R/ W1 m. h0 q( r
' O; {: a: m! I
' G) j3 W. Q/ F9 @! Y" m- , m7 b- k+ f& w% k! D3 D! @
- ( P; g6 D2 G" U8 U! f
$ @' }* B5 q R1 R6 S
" R- \9 M$ K% R' R
3 g5 S+ E, V6 P2 p$ z- $ v/ q" ?% Z% m8 z' ~
/ K% E6 ~+ V* Y( V0 s- 9 ^, j4 m& z5 T5 N) w
9 H6 ` V, Y* y- 2 |5 K% Q( t! _/ ~9 T
+ G" M$ I7 n' w/ V7 m" k0 U% c- 5 L- k; v5 D5 q! f; y9 V
- - T3 n1 X# ^0 Z& V6 [
& g4 Y* Y V5 r% [/ O) k' j- 3 R# U! z, M4 y$ |- ]9 q
. U* Q4 [# I- G0 K! Y3 ^
I% j- S# S; v& ~1 U
4 l! [1 i2 |0 g4 E/ _' N. W% q
6 j* C( D1 E0 K! U8 ?8 P
4 N! c& e( M, }, S2 f% }4 A \- 6 `; _" g* T; F: f
1 ^! n' h+ }9 E0 W" L
" i6 A. [% G3 T* I& l2 Y! q% t
1 b7 `! ^6 g/ F" [ l- ]' ]. i
0 f/ i2 S0 e1 g* O8 ]7 G# f- - d# d0 V# E' R; `* y- p
' L6 s8 O, H2 x. H) u" S; v9 ^. F
1 A" {% A( v( X/ @
. E. I' {6 J( o, S, B" N% H9 G5 \/ \ c7 ?7 E; S$ x+ 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)), u. ]: r$ ^2 n) R: q
1 [. l5 I6 i" F. i
0 D6 K/ k* {1 M( M* U- c颜色表:
" y# y0 }/ x- u- }3 { {
5 s) O9 Y- s# l! H9 W
|