|
气象数据可视化主要依靠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("···") ; \, }# T V+ r2 }
只要按照以上六步,基本绘图没有问题!!! 绘制中国区域地图 下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解) 例1:绘制中国区域基本地图轮廓,包含省界 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, _! \3 r) t% g$ I, c. q4 S- 9 J* j) X7 O' } W4 {
. u6 L) Z- t( B1 T6 _2 S
. h1 p9 U- F8 r- 8 M" A1 X9 d! ^
- T; J4 J, L2 G# C+ g' d. f- ( C+ o5 Q/ H; x- N9 P
- 6 Z( ?& _: a8 _$ b, U$ A0 N, s5 q6 {
- ; X6 Z8 C0 e; s1 K7 v. K
+ T# y/ m" X3 Y2 X ]' t- , d2 b r4 x, Z: a( o
, l8 q8 R; R, x7 g8 \1 Z- ! r' [8 _7 Z7 y. i7 a, G5 _" R; ^
- 9 t/ @1 x0 L4 Z
- $ v1 ^4 Q0 L6 h/ n
; w2 O$ q3 {( L8 Z' a- 7 Z, O, s' r/ A7 }# E
/ G& Y) h, w0 w- 1 n0 z( m F! W L
; L& b( ~, u: u% Z4 B/ Y0 U0 \" _
/ {/ W4 q. B+ W' J0 G- 8 t9 u6 X3 c$ d
8 K0 V9 X8 g/ a0 V! ` M
, c6 ^) [: f8 g! d
0 A. E" S1 n' T8 N2 d9 e$ V$ G2 }4 J5 F+ |
#绘制中国区域基本地图轮廓,包含省界#引库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 {4 r& i2 Z) v5 X 0 g# j+ L6 k3 M, U6 G' K
4 P6 p" Z5 a) Y7 m0 C例2:绘制中国区域基本地图轮廓,并标记各省会城市名 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
, V: n% A/ J- P: b
, Q+ a9 A' S% R! r- 1 P7 T6 O8 E0 N) v: k x1 @3 f. ?
3 G- z. Q9 x; {7 C, j% E
2 U$ T2 f9 E: v( @( e* `5 H- 2 b: i, U" L2 G, I5 E
! \+ S/ {. o+ b
7 x {, F6 ]" I0 n8 j2 i
) k" z% H9 e) a6 R# `. Z8 D
$ L& L3 Y% {7 L4 o
# w2 U% j" [+ e' c0 _+ ~: [
% G( D6 c* G+ S- : C& B0 L# Q, n5 H5 V) b. r
- " ~- ?$ ?9 j# S9 {
) x6 u2 b7 I1 ~$ N
- P- d) r' W+ v _& {, M5 p
" h# D! {% [3 [9 ?' E$ B- ( R9 P' z+ S- p" u3 q
1 M/ y4 ]* T2 a$ e
( p- E9 W. |) L* j" k; z! {
#绘制中国地图,并标记各省会城市名#引库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")
+ B$ T* x8 n5 R5 w- x! L
9 X1 p6 R) c* o4 K4 W* j* s i* z) [& U. n' h
例3:绘制中国区域地图,包含海岸线 (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
+ ~8 D; ~# o8 D# q/ | `2 i9 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()
8 ~! t/ P9 k/ B3 g M) X' S * V$ V& n- ]4 U3 N0 S. |$ m, @, W
- i6 ?9 P, V5 q" g: e( Z( x
例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
$ X9 d) D2 R9 [- : P+ B& w; S" \" `
- 7 j T" U2 K3 N! M' w, R4 Q# Z
: S& v9 _! B+ w% {1 o
2 v e1 M3 B5 ?; X# Z b+ y. U# s- ) Y0 T" h& ?8 g( k
1 B; ^# t, |' n7 `
# A' F! V; K# P2 [0 b5 Y' B: ?
" a4 h% d$ E- S: `& p
/ T! W) b" c7 A# p. I- : D% m* ?, L' w2 |( C; h
- 5 U) y3 m* I- [! W I% V1 n5 f/ Q
- 4 d2 j: x* |; F' ?
- 9 E' \, J- c. Z& I3 B9 n
: o8 ^5 J5 t( }) ~' v2 ~
$ `/ p# X! h; Z2 T0 W3 g) j
: R# J% a* T! y* g" \ |5 P" [
- e5 o% ]0 e% U; Z5 U# Q- * f% ^' t# m: A
, x# x' e& g4 D4 t' Q; @
3 @3 t! n) P* e, C' L' w- 8 ? v- v3 e9 @8 _. q1 {6 [$ r2 M
- / k+ @* c2 U3 z% c% Y( d) k5 m+ j
1 A7 ]6 O' P/ k8 z& A: h2 D9 f2 K- 3 B! G8 \" h% O# a! K
- 2 J {4 P4 h7 ?
- - c9 V; e6 R6 m0 T
- 8 q7 T' O; E+ v: V9 a$ \; Z' v
- + }5 F5 m7 Y, ?; f% \
- # k7 _+ ?4 v+ a+ ?- C' `8 v; [
8 }2 i- s7 X! g. r. |# Y
. f6 [8 ~1 m4 J, a9 u$ u
# y- e! `4 b: [$ W# H' |% W* L- * f/ {4 n4 J+ w/ R# A; W6 ]
- 5 X9 E( j* [2 I% F0 d% _) \; a
1 C' o: i% S5 A& K# l- 8 m0 q8 \; Y9 d3 w! a
$ k0 K# ^& Q& d' C( I1 B7 U0 ?- ; P9 W" q: W) ?& T# u
% O& |3 X* \( r" K- : m$ t- k' t- d) Y* b! r% D1 N+ {3 K
- % M- ?9 k7 K6 x z1 `4 N
/ }2 r ~9 S X( W$ Z$ T
#例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))
- B+ E" Q9 [7 x" L! p$ w+ {
/ k9 g4 M" b3 i5 o# ?* s例5:绘制世界区域地图,包含海岸线(中国移动至地图中心) (如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)
与例4不同的是只需要改动: proj = ccrs.PlateCarree(central_longitude=130)
+ v/ f6 c- k/ R0 G- Y: G. B- 3 ?( Y( S2 M4 U& S' |; c' P# o
- * m- Q( L# r# W$ r, Z+ ~9 p' g7 |
- $ e( E5 I& }" B! x; p* h2 G
- 8 l/ G1 e8 @, p
. L W; t1 X9 S% f- ! ?: \2 D( w5 y0 P3 Q- c" D" i
- " ?% A. P/ q. j) Y# G
& }$ X" E) X) S: q. O- 0 \3 b" V3 ~4 l+ E" E- H, z& k
+ q* \5 X8 n E9 u3 [# O) A- , e) o7 |" ^5 U$ s/ K$ W
3 ]0 n" ]+ F$ d2 Q, x
" J! u3 p+ j$ P, y( F4 E- / |5 y3 d/ _, m
- $ g# P" f5 j& v, O" Y
# m k E9 U4 S- s2 k- " s/ o$ M3 \4 y$ d7 r- M. r/ \
2 E2 e4 s5 m" |% [- ) ]" h# f9 l4 D: I3 U
$ X( w, a! s R ^' G$ n- + K8 z$ K7 b: N- {: E* ^
+ N0 E/ @9 u5 r
5 N+ I4 _' D' M# u9 n. p
% }2 ?+ v- B9 f" p* x- 6 L* E! A$ } y" {2 b7 J3 ]
- 1 u" Y0 ?) c& X! J0 [5 P
- 0 W5 p* o9 N7 w& r# R0 ?0 B/ A
- - y y, S. L8 a# g
- " [' Q& b5 T' r* y% m0 M
/ p: N# j) N1 X
; o; u3 p) q( O- ) A0 m# b( q' z& M5 ?* d! L; S
- ' J$ I4 N& A0 W+ Q* D' d( B' [
- . A, ~4 N0 k' y1 h: O
- ) Q* o& e6 K/ Y5 l3 l% X, J8 h
: c5 N" |& _/ o0 j+ |/ C7 s- 8 H0 d& U$ Y9 o7 I* K4 Z
' V" }. `. {9 k! v+ I! C
' ]4 r& p- U+ B: N+ ?& S# ^( w8 c6 q6 ?$ G
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 t% X9 J u& Z, f @& N; P
- f: j$ V7 O @
( C9 i* r, W, R! J: @ c
颜色表:
% H" x$ r) i* X
( R: F- z7 c8 f' z& Q |