气象数据可视化主要依靠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("···")
" \! }) W2 a3 d3 x5 f& P* ?
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
' E! F3 O6 `, X- / Y# f; R% Y x' l; G
- / h1 @6 O# y B. S
- * J9 q: W6 l0 T, q& Q4 |
( L) I; z2 l7 Y7 \- , j- w0 I! l' S; |" `
- ( [/ K* q0 R7 B3 r6 q3 Y& f) d
- # H/ k: x% `7 G0 c( \
0 }7 R3 r; r- t- `# R+ h7 c' v: G, p- 8 }1 M8 C+ K' w# Z3 K, s! K
- # @% ?: | L! c. ?8 h- i+ w- p3 L
( R8 K0 @( S" T8 F$ ?
, v6 j1 P' I+ C, v( ^: k
0 R* A" m) Q8 v# `
. Z9 P/ f* F( l! G8 u
4 m& i2 J. M4 L& U: R2 i- ?4 f5 U( H) H$ m/ t
- 5 u# f; v3 ?4 I9 |* `
( U# i8 _2 w$ W- h
$ n: r5 y7 F* N \! A4 \
/ f8 X: Z Z7 Q1 X$ m! P
' b! Z# h) q2 A+ V \# B+ Q
+ P9 z6 V. ]( n6 `
8 T4 g& | k/ R: q/ P
& K4 a% K; q) q2 n/ v* M P8 a; n6 r9 @3 h9 p6 i- d
#绘制中国区域基本地图轮廓,包含省界#引库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")' y1 t$ \ T4 w/ f; ~% N
% r5 a3 I9 K: h1 B. p0 J
5 t: X0 t6 U% ^! c例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
6 B1 z2 G) o2 a/ T4 ]
- E+ a3 ]6 u/ Q: Q6 h; I3 a& [
) I0 Y$ ]% h' n7 _$ w
) d |. L- b! B, ]/ b$ q: M
: ?/ E% M2 P4 x+ o- 1 P" w$ b4 P T8 X% }" `
4 i9 w; g& a* i; o' r+ @
% f* g. p& t8 w0 a3 M* f5 b9 @( }- 8 \2 }' C, S) g3 q( B' V
- / U3 U9 l+ f1 n; F
- " g7 v6 k' c$ `9 q* Z
- ) j/ b% t3 K7 c" b" Z
- 7 K5 O& j! N; l- z. ?
5 |' {2 H6 O4 L0 R
7 U$ @$ w- V+ Z# E( F- & b, V' }# p; _
- 1 X& E7 Z; I& u8 l! D
- / ~; \6 k. I: @$ `; k8 C
- / m' R/ {! H+ r8 ?/ O0 C
4 Y4 U4 p4 D- `5 C. s3 h
#绘制中国地图,并标记各省会城市名#引库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")9 f6 ^- q: A. N; E( Y
. \; x1 a' B% r' K- n* t2 d: ^' B. j- n7 r7 w7 c) d
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
; K# Q% f0 `2 I3 K##绘制有海岸线的中国地图#引库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()
- c+ i4 s& V; d2 i4 F$ P . Z0 A) s; x- K
" n2 E" m* P3 c' V- N例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
# H3 `* \# H* l* D" P# s6 E- : l+ R2 u6 j$ Q1 X8 o
_7 @5 c; t% k2 \3 _, b
9 ~1 x" O1 Y) Q4 e+ ?- 8 F0 Z$ D |8 K, }
* c3 c* i* c, u" H5 Y
8 m+ ?1 t+ i# L% R, e; u- H
3 q8 M1 j; K9 d' r% J
( `8 m k2 i2 b/ i) J% X8 w- / H8 G* q' N$ M
- # R h2 [) o0 |# j5 B+ z
8 i/ H+ F4 u1 G! h9 r- 5 K) W1 t7 C, ~# \
- * c/ q$ {! a- A
- 7 M6 H$ ]' E: o( w/ |: ?' Q
- 0 F& B& r# j+ w' l% k5 D
- , C, Z) O8 M& E! R$ E
- f+ ~, C/ y) Q8 f! R. E
! O1 h1 U# [0 V& T( X7 O
9 }7 c2 p# s1 d5 Q& ~- P' ]( m- / ?# O0 c2 }2 W2 D! O
- % ^, R* c6 O4 }4 w# p( m
4 \8 |& i$ ~ g/ } w7 k
9 D; w' e; k P9 c( @0 _( C
; N. ^! H2 D/ A' g3 t6 F
8 L; |7 s4 H" v6 {0 l
! B2 ^% t7 q; U5 |1 Z4 X
' P4 f8 v7 ]: ]! x0 Q% q! q- ! ]! w5 F$ N: D* f
- ) L' G6 d! I+ I6 @6 _/ G
- # [$ S/ S1 q' m( \9 k. q
( \5 C. E5 E1 s
7 }; C5 W' s" b: I
" g+ @$ U; \) L; s5 p% ~
) B" U! f. @: \
3 x# b( D* `3 I( e; j- 8 ]* D5 h& E6 ^" [& Y" z
- ; ~% F9 k' N% {7 R) X
- & ?/ v/ @2 V. J+ k4 W+ P- Q
+ h/ ^# z4 \5 x8 w- m
2 m7 S9 J2 `. O( P1 `9 R- & B6 z2 G+ c. r( E2 y0 l# B' Z& L7 l
! T5 M, ^3 W- w7 `9 N
#例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))3 j* c3 a u" n4 p" | ^, g& [
, {! I7 O/ U& P6 v例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
q9 l- k# Q: a) B/ D7 v0 {2 L- 4 N* U; h# j! L% E, g6 q2 m% t
- 0 m/ R) V- q7 F O( i
- - C% |& a _- @* g% H$ A
1 z* v: ^5 m; i, i! L7 H0 n# Z- 4 Z$ w+ ]1 k" p$ R: {% D. U
S$ z8 w# | C; a8 T# H
6 V/ a' }0 l6 s, I
. j. g/ ^' m$ o7 m- 1 h$ |0 C1 B3 L$ Q
- : D5 U+ X! J# R j/ u
- 9 |0 n* E8 T9 D6 @9 f, _: T
+ S# w0 @& ~- {
Q8 a. F1 n( L* D) ~! }- & G/ E+ Q" D$ b# G
- 5 a: U0 [0 ]1 G, _6 _ p$ z( H
# b1 i3 Z4 ~1 O# y- ! V4 Z9 ~9 C. Y& l
- 9 D' x' S9 o- l* N0 K
- 6 r7 @# F% r; U! K% B
- $ |! a' Z8 \ ?/ k. j
! u4 j* K" W2 h y
' u1 |( S% s9 Z7 m- / H- U6 D, @1 c3 d0 ?% w% n
- 1 ~9 y) ~7 D' W# z) y0 d, Y) f; z
& o) d" P5 _* t- ; p" K7 d9 J$ ~
- 5 { z& V1 N: v) l
4 I% B0 A" X5 b# G; r; Z8 S- F: U
' O: o+ w2 i/ [4 Q( S- . b2 c- a$ ^4 A# l
+ Z( N, i0 c$ ^0 B! q0 `" K- , [+ L4 ], w6 M9 I9 a
$ b$ c7 u' r' U; p/ E1 u6 v7 K
?" A {% ~1 y7 ~" I0 _; q- 2 ^! p1 ?; Z9 W
8 u/ d& P! ^9 C8 o% [4 ~2 {
4 P6 Z) V4 }4 e+ O- X: h0 c0 o" h( r! Q
9 w4 o7 v+ U9 o) W* t( ?3 G R3 j( C" c5 c1 E8 \
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))9 F) V$ Y- v$ x8 P. w" j
( N8 e3 k5 b" [( ^' Y! K9 T3 L+ u' k, x5 G1 g4 ?* ?8 B
颜色表:
1 E9 }- G8 p8 \6 }( H) R
$ Y- L7 D5 U* P& s |