|
气象数据可视化主要依靠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 K! G7 r- \. p2 R& ^3 a3 f3 {# T2 [6 L
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
% ~7 ]% Q& U8 j' H
2 {8 n8 o, R# v4 U! ^8 l* R8 c- ( q2 P* x. b: g8 ^8 V
- 7 O* Y( v1 @* }5 e4 @: v# T+ g9 Y" A
- 9 a' H ]. z2 }8 m3 K. Z
- - G( w. R& @' R0 r9 I, B" A p
# _* x' X/ Y5 }! I! E7 ?7 z- q, y
) |! b/ w0 [, K( M) A4 y- ; X3 h% e* `1 r# P
- % ~4 l8 x' v ~( W9 M
% B% Y# j) l& r- 3 N' Z; D" T& o
- 8 O1 B1 L) a& L9 Z5 J `
4 @0 t s0 T# { Q4 V D" n. L
" w# x+ M2 T; g9 ~
8 _5 Q4 a& w. U: s+ i; w( Z
5 ]9 i A% l; d1 K0 o+ |8 f+ y
- X7 Y9 i# X- l9 {! c$ f
2 v9 J0 I" o$ ~0 B4 g) g- t8 l- T- 0 w' B* O/ q2 v. h5 f; d( T5 n( {
: d, p2 O$ r4 Z+ T- $ }2 { l3 `/ D. u
* u5 i6 A; a, V4 y+ N; K- ?- ) h, e9 Z, Q5 V( s& |
# c* N1 D9 C- X) T$ j( B
: C; B' z8 T, R6 U, V r
#绘制中国区域基本地图轮廓,包含省界#引库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")% T" t' Z5 e- P. ?4 D6 I" Y) J
5 @) q" j$ v7 X1 B
, A# W7 p/ `" x( M4 W例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
& |( }" J: \- I& m1 Y5 }. w/ x1 M( A- , w' B6 R1 Y5 c7 Z- Q* z
- - [7 |( U7 z+ W9 V3 P
/ Y; g) T$ J" X, e. J- 7 z# J5 q& Z1 _$ a% G/ }
9 X8 B0 ]9 k6 t9 D' V- 1 B& E& ~- r" A5 l0 y
- . ~4 f. z" |% z) Z9 Z: I
4 [9 O! M. p: O e: X `7 ?% \6 H- ( e& ^, ]( `: B& b! ~
- + V" J) r3 q* D9 D" q: b
9 Q( Y7 Z" ]' a3 ~) j1 l t' z! C7 Q- % E( ^- M k* D
! J, k5 U0 R% v# c1 q- m1 i3 l/ }; k# X6 \
" ~5 k1 D1 C% l4 E8 I" J- 6 h4 g0 [% H! P! X
- ! o5 U- c, r% G. u
( q- Y D! M( Z2 r# q1 o( I
$ _% f2 y! h! I; G0 s
#绘制中国地图,并标记各省会城市名#引库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 b2 P, l& l. j
& c* T- H7 d. ~ E
4 x# U+ a: O2 [3 e
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
2 f/ X1 M4 L" ?9 F. E- - b3 u/ L- G& z( S, A) H7 h* U
6 }0 {- w# W7 k: \$ k% \& w* y5 J
8 g [6 e9 g6 B
( e* j. w C! m' D& H7 z- & R9 C+ G4 t/ r( O
, a# T' N# H$ \/ O6 k
# v. g( b9 p. Y
: G* ]6 P# V/ j9 u- # N- u/ [- M& J) `
K% _+ D* g6 y) X7 T5 w
" ~( U- M! h, {7 G- , X& {4 j5 s1 U/ ]4 R! U$ Z$ Q4 p
/ N9 r! a w) V+ p. s
0 d: u' v, f- Z- , y( `$ a" H* T$ J
- " k4 d; T# o* K7 N) P' w2 x
) S& W: \3 |5 q$ N" ~9 f$ m
' @* X) K) |' i9 A. Y+ Z- 3 X1 Y% F9 G0 N3 w5 ]$ |, ^
- I- l* a: m3 }7 |$ U7 K. s- % F; V$ _% p5 a& S M
- 6 h, _& N+ r* g) p+ k
" {5 ?1 s/ i1 L/ f- E
9 ~& g9 J2 G5 h6 s5 Y; F T) D8 s- & t( E' u* h. B, ]+ [# M
- z3 s9 q7 F- Y" s$ J
- : c, M- m$ M/ j$ P
/ P4 a# v6 j% l) A, f6 K
" j8 m! f3 {# o. B( @- 0 E; _( `$ K- ]
, C" N# n% V6 O8 q' q- 8 R+ }) S1 r' N3 u- G2 k1 |
- + d$ b/ O' ` x. k. c
% t: I+ M* ]7 m( G- 1 a) A. u9 q8 p6 Y; ^9 s/ F
- 5 W) L( D* u' e3 R) O7 x
; _" H7 \( O2 i t7 _6 C7 @+ [
( H# U4 S# {8 o( [0 f1 |
$ L+ I, J; @+ F% y
' L& c" @% ^) E9 g
5 q4 y# n+ Q# N: d5 S, n
6 U4 H6 i y& P
' j) ]$ c* Y2 I; Y- M7 T& A2 C$ `% F2 D1 s
0 X" \: D8 [9 Y/ ^: I7 {% c6 I5 u" l" W
$ T2 `: A4 }5 y/ a$ B- 9 H! y( R9 u2 ?( ]3 b# A. D
- ) W. B5 J; d0 i( w7 D0 ?: O
- 8 T: r4 W5 l |8 ~
. z& e3 Y/ {# Y% b- y5 p: W3 ^, [- 4 R; V, n% W2 n1 s* ?- w
8 }0 @5 P& I# I1 q3 y9 g% F% Y
##绘制有海岸线的中国地图#引库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()1 q7 ], ]2 f$ S( d
' x8 R# A. S& y& W+ R3 L
5 d. ], H* Y7 ]) a6 j/ A
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
9 a8 n, j( x8 B. O3 y
: k- ~) Q( i! m2 l1 N9 Z
9 q" T6 J% o8 d) {- , h8 o+ `/ P2 }/ w8 d. h3 W
- * w- P1 R2 M3 @
- # @: y$ t; x7 l. [- |- g. Z
3 G, @) m3 G7 ~; J- / ?# F; J, j9 Z5 T0 f
: f0 r7 I3 f4 W- Z! }- % @- f" Q8 u- f' Z4 t3 k4 e: m2 U* [6 Y
. }3 m* X4 r4 C2 D* U) J. K- - J2 A& W& Z& K+ t( {* G
- * Y& n3 q9 b; N) Z8 k
- " X% q" D7 [0 ^
- # m. a/ H5 |9 ~
& ^' d7 }+ u6 |5 U% g# t- v6 g& O- 9 B3 i. E0 k `/ O3 O7 v1 G7 x( b+ R
- g7 A% B8 {8 S4 l. w1 {
3 r$ B* L2 h7 y2 x2 Z
! r8 ~; z+ q% ^" F
* c% R$ k; n$ z8 g
: f5 H6 m3 o0 ?. Z# K' [
' T+ C; m4 y. o5 r$ o7 q, l; o
$ M: R( m* [+ r& f" b: ~$ y
- Q' p- v# _+ ?; G9 P- , H, ]$ Q0 c) ]
- 8 Y, O l% k" t$ N7 V% @+ x
- + m8 V+ E% z- [3 q+ p; x! ~: t G+ \
- 0 z/ }9 }0 @- c7 u6 [( j* }
8 i& T0 e6 r0 t1 f- ! v! c7 G( D" ~; [
- 0 S: @. h$ ?5 I6 O, Y1 ~( a
3 D# p4 }! @: t$ R9 Z* d- 9 U& L* F1 j! k
( y; D0 b. \/ }
0 W" [5 `5 F8 g# e
! B8 @. J* E; ]2 O$ ?4 i- 4 _- }) W* f% H% X
, X! @' M' _4 j8 e+ d& z- 3 |& x. F; ]/ x3 B2 P2 B8 u
$ F! X9 s7 s6 R- 3 b6 C6 P8 h+ q6 d! _
: @0 I3 Q5 h# X, b
#例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))
+ w- s+ i* \( X. g6 I$ W 1 }) T K% ]& x* D4 e
例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
- y& ?# T b* J) _) U# g, m
% O8 j: A3 W/ [3 H9 g+ d( d
8 _) a, ~5 w7 m; U& T
" I1 Y0 T1 p6 M! ?- 1 r, J* ?* q$ N3 b( L, c8 }
" E1 P% Q3 G9 N, x9 }3 c- 1 N1 s/ L8 \1 Q* N9 u( G" R0 ?
- + {* `) q# i8 G% j0 D
/ x$ c+ d# ]6 X" ~, d: C4 k
$ [, l3 e5 v1 W+ g- 9 N9 D- [( n2 \, U! ]; h: Q- L* I
- 0 \% ?9 Q1 x! j8 j7 G0 `
. y: M& T* B' A6 w- o1 R7 ~5 K- % x* z4 e6 l. Z, c! b) U. g7 G
- 4 T4 ]% F, `- _
- 1 k6 V N" [/ l" T- Q- o
" r" i& A5 z' J/ w$ o4 J2 U- 2 u+ T' B, X- P1 y- F' \# t. z
- ( c: s* z" k( D- ^0 @- Y& L9 P
0 X2 T6 F2 X3 d: @6 V4 s0 l- ' N! I/ Q% a4 u
- 4 a) D. W3 {2 X, C. b( w) T
( m4 R9 P2 P) K% C" e2 ~6 j. m6 t
) W" i2 q% M+ {3 [$ D; f- . E8 k9 I! z/ f) @
/ @$ n4 b% u! }, ~- ] e
" Z5 F7 c( _2 M( {& q ~% e
" m& I8 @+ I9 o& z$ Z+ G
7 H" j' Y2 v( V8 l- b% K9 ?. o- , j6 D5 I& a4 F! A' ]. { H$ i
- 9 Y) }+ |& O* p9 L* X
- , l# r- ^* M7 h
. w. Q% ]3 V# R* I. O2 C
# Y7 ~( _& c7 ^! c1 [0 Q9 ?
5 ?% J2 t9 f) h# h7 B
1 S( C$ V; q/ X" q- r5 j; F4 ]- 0 i8 h( a) ], ^) s' A
3 I7 I6 o4 s1 P& [/ ?8 p$ n7 N
/ T0 X- J% D) L: B7 G
8 T( f* ?8 E k% _! V4 \& Q6 N* [" ?% d, d8 |! ?
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)): l4 X- T" n- e1 d% h) c# e9 L
& a, m8 x; R8 u4 G
( m A5 h- `7 a" [! B/ x- _
颜色表:
2 P. G& N4 k; r/ E" w; p3 Q o$ J0 ~: P
|