|
气象数据可视化主要依靠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("···")
$ b& n1 L- ?9 ^* L. s5 R
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
- , c+ V$ G& F+ `" [
- - U! w9 a/ M8 Z% O2 h( b V
, g5 {; e: z; X1 \+ y" Z
. K- Y- C6 j) |$ f- - F. h; }8 i0 Q
* S0 g' |+ r& z0 \- 1 K t4 b) D! u4 w5 i
- 7 ]% L- w& H: G5 w. C
- : B. G' P4 t+ a7 F& {& b
8 n8 N* h4 a" [2 H
8 Z( p4 X0 G! a# ]
* X2 l: x' ]5 \- J- , f$ d1 c/ R6 u* I* W5 n+ M( }
8 z1 A' q1 @, o! K& z- / {) X. a" ]$ @9 h7 n3 A, \7 X* c! q
- K" M& l. D# P( W, e
- . o: j" ]7 _. c' j2 c
1 d2 T) _7 Y* b" \7 G: W* ^7 k% b" m- v* O+ F& G5 c8 J
- - z! e, `% }/ a" A; \/ j
- / n6 |: J s& C& r) B
- , L3 d1 h6 t5 ?1 J7 X, ]4 B
+ H% z6 Y0 f9 E+ U- : z$ K6 }+ K. ^7 L
, b; A$ c8 V# y: H v& M
# p/ ?9 Y2 z7 f; r# G6 A
#绘制中国区域基本地图轮廓,包含省界#引库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"); m" v" w/ i- Y* l/ g& `
% M& A" n& \; n9 m1 G1 h
8 f/ n8 o, {8 r例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
( E1 j* |5 f+ l' ]7 n4 c
' v; A9 |% F9 h L, V. G
. [/ y% z% K# h- / L' g* t |. n$ _* b2 J: W4 o
" _7 |" `- J2 x4 Z) u( M" t# ^- 9 S0 p/ |! Q4 Y2 d7 j# M! [% W
3 `( r3 @$ _8 M ~, t( k6 N+ x, z- % J! O" ~2 ]: p0 U; ]
& _. g( o, ?# m, _+ V" Z
- c! v, ~! x# c
' N5 e" @$ x' `- + p3 J" ~ y6 p2 x' g/ h! Y# O+ |: I
0 O; R0 k. D: M$ u1 |( S: {
: B* }5 E" ]1 R; A
! T- F* v7 `; u" i3 T3 [- 3 A( L+ n7 n1 w4 \( s
- ; a" X& i6 V) e* j6 \% _ Y
- J5 ?! T8 ^9 i; c1 w
- 0 L) M( ]) M$ W9 n6 S
: L/ M4 W: ?* i8 w! b& n) V% C
#绘制中国地图,并标记各省会城市名#引库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")0 L! t' {; a! Z3 E0 P* F) m# R1 }
/ B4 e5 E3 b$ w" n+ X
" R5 W8 K3 x3 S
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
4 W! X2 ]; Q6 D/ u
- % B* Z$ A% ~$ S+ {. u. y& o' P
- 3 d! ?" j5 g( O- m
* h8 r1 F, k3 r! a7 B
- [8 g4 s, H3 @* m A2 P& [- s- 9 j* g2 Q! p8 A! _
. Y4 N, i) R/ {- 1 D7 K& I% A: @( V. [3 P+ k8 c8 I) c
+ e, G" }1 A1 O3 _( M( o/ W1 r- - x; \' m3 J' M% Y
- : {1 t# l1 r$ p$ V% Z9 |$ {1 ] N
4 \2 G- V' z4 Z% X! H
" \3 Y& O- d. d- 9 [ W% I- W6 Z8 P4 o) o4 l
' n" H$ B; a) @! r0 e- 1 n* t' i+ ]% D5 r/ n) q- L
- F8 V2 {" i6 Z9 ~7 ?' r" X+ s
; {6 z* Q/ j) x3 v' G- 4 b8 Z8 p9 M5 ?
- $ U. j0 ~/ o1 s0 L. }
' f5 d4 O* b" u0 o! Z, I$ f: F' X- " p# _& L- J, b6 D/ {( d' T2 }
( I8 L. P6 t% y a/ k' K9 B- ( ]$ x$ Q u$ H* c
: s" _+ t6 B7 r/ t! C" ^. p* B
. A6 R/ X3 Z, D- j3 Z- 1 D+ ~5 D! j7 `) l; f
) B: w, ], C5 M1 p; }3 N! T
" F' D9 V: ~2 |) I- & e9 {+ R0 \1 p! l' \6 n0 B l
- & {! p; u/ S" T, ~4 g% R9 K
- / Z* U, \& v. [- H8 d9 r9 `# A' V
! l- E) W: j6 j( ^& W' w
% r2 V0 e: X( k l$ K! H
, O: e$ B0 Z( C- , Q# U+ d3 ~, I2 u' W* x$ I
- / w: n! \0 J- q& H0 G
7 H6 g! q: k& X! s$ ?4 u- : ?5 |8 R0 D9 k: P
& V$ O; e; R. y2 h9 Q# p1 [- 4 i" @, I2 V$ Y' @
- , @1 P" L. d" H5 T2 ^5 {
P/ Z" `) _7 ?' B$ U
! }' o0 G, {0 u1 E
/ g' ]# n0 P# }2 G
& x% i7 B& \6 ?) d - + x: a( x. x3 ^) ?" J+ Z
0 G* I5 @9 W/ w/ V/ r6 |% g
( ?# b) D8 v0 X( l- ' x+ g; t3 Q( M, G; @
% x7 ^& H/ G7 j( X# V5 \4 J
! s, F( O5 q8 g, ^* C. j3 Y4 G) ?8 a- g) @- `% ^
##绘制有海岸线的中国地图#引库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()0 a2 J2 s4 {* w
6 B- y/ E/ c T
* t" ?, S" K" H: B$ g( {
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 a# T3 o5 F/ H: D& V- E
) V! T( J& K8 V
/ {0 l& }6 F- t" _" w% f
6 Z) R9 \1 m, E: _) o% h5 n
9 J* E4 q1 c; ?+ [) ^( v! X/ y8 H! b
6 ~0 X9 K1 \" o/ Y8 j- & f$ y! d# b+ `: m! f
- * p: Y- Y2 S; }9 {$ m8 X
- U2 s! n) ~* S/ `, A# p
- ; B) R% h+ |2 m) Z8 b. E6 v
- ; W" T) `# t' z8 [
- / y2 H( P4 O- t0 w( l3 e
" N% S9 c7 ]- e; [) T2 A) f1 T; E9 ?- m! _+ h3 S" o: O
- 3 c) {8 f4 N; m# Y( N( b; S
- n; w& p/ p, J0 }3 `
9 e1 `* H" h5 y6 ?( {
1 U# M# u- t/ {9 b1 Q4 C9 I A4 k
H" W( y1 O8 u$ o) q( }) S- " g: W. X: T- w7 H. i
Y6 D$ y" }% n
# @, ~* i1 b7 w- \0 Y! A- ' x5 p% k: A( Y( ?! \9 s& |
- # [. G6 n2 M# z
. Y- x! y. {0 K; i: {- ' X5 L% d% w& D0 b2 T8 f) }, R
- % b. l' d4 U7 t9 j8 N
- ! ^# |; E6 h2 L9 a8 p v! s
- 6 I2 _- r1 r2 i) T( Y
5 p: o0 K ]) y5 s# {- ' e- s7 h! R. e1 V9 h) [
2 e0 R: _7 L" y9 w" {/ @, I; [- 0 B5 k$ y6 |1 L2 s, E0 G
+ a1 i* q8 [$ n. b
) K. t6 m, V4 n
0 o: X. ]- T# V- 3 T/ ?* V W8 A+ X" v$ O. U
- * H' |5 H' @7 w1 o1 p1 W
- + k; g& m- ?2 [5 L
' |4 u5 e' p' ^6 O) ~2 _
) p6 i, m \6 g% f6 _
1 [ H% v2 y* K0 u( j# h. A9 o" m4 R* V$ c' K- y+ B) P9 l3 Q4 m
#例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))
' A+ c/ {9 j* P2 k2 l
/ m9 Q2 l( p0 G, q, G/ v例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
: f( T5 ~# j8 q- J9 \+ E8 s' N3 \- . t% u( |5 l0 t2 X
- : E! _- o- k' ^& d' j
- 1 N# L# @- N5 B* K
+ T) G% C `# u C# p- % v1 P: ]: z0 p; [% d) U* D: L% a
' k Y2 ?3 X; F- C7 O$ `- 9 W b; J& q5 h" M p r: G
- ' m4 h1 h' d( y/ \2 e6 f! i1 N1 L
" M- z, y$ `# C; {' ]
+ Z& x" n' P0 u; K
5 x) ~, X3 m! {0 J. i- 4 d: z& R' |" ?. j& j
- ) b3 N- a4 A* H- l4 V, z
- " G6 K3 ?1 e4 H9 |. G6 @1 j* i4 r4 @
- & X+ U3 [/ r/ c8 U7 G6 J
- 8 L/ z6 C) z9 c
# K; ~! V! N, X% _, g# Y- 5 e! ~( Y3 D+ D6 Z3 P6 a, `; Y
- 5 |8 r$ F9 C( r5 F; Y! \
- % _1 R8 A. R- r3 S9 i& }
- & M) D5 R: {' i' l4 j+ O
0 B; I1 a7 R' @( t* \: J: K
. }2 w+ G0 x! _+ d
3 g& o$ n6 C7 {6 \1 x
4 A3 P$ N( x5 `) Y& b
; T; ?2 Q% j/ a. @7 {* t
5 P A9 H. g# H9 \- ! Q& Y. e4 W8 E* F' b5 S2 ?9 J
- 5 r% H- V$ @1 f2 F; q f2 W
- E: c% g& W1 x4 Z2 i" b
0 K3 y5 Q- T1 U- j* X+ q& ^
7 M& d4 j9 K: _1 `1 i- ' _* c/ [4 u' p1 A& D
3 D/ k6 w6 g- }& L0 n
( ^" G0 w3 e; D' D- & h m( I" H' a' P
* ?4 E6 s- {$ Z- V
2 v5 l j& A0 i) Q/ \+ A- , z6 M- g) T, E; o
( B& S7 R3 `& b3 Z# j
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))
7 N8 {% H9 a0 `$ [ 7 e( M1 b: Z4 F
( H6 z( U9 V% r8 S8 b! `1 ^9 a3 [
颜色表:
) S8 \1 j1 S8 ]7 ^' N k7 C
5 T x% z \7 k |