收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

[Python] 【气候软件】Python9:绘制中国/世界地图

[复制链接]

气象数据可视化主要依靠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("···")


    ! x+ H0 P. {; {0 V8 |

只要按照以上六步,基本绘图没有问题!!!


& _1 h2 K9 q: ^, H. _6 O- W$ W                               
登录/注册后可看大图

绘制中国区域地图

下面直接上代码(关于代码的解释已在注释中详细说明,应该能理解)

例1:绘制中国区域基本地图轮廓,包含省界

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

c26711da656503932f79c8379d2d0aef.png


  • ! j$ S) Z- O% ]/ e5 @* r4 B: f/ s6 e

  • 2 \, Y, @) \3 E5 i6 `/ e/ a
  • # G) m  w. h! A9 P2 w* z/ I
  • 2 b: `2 ?/ D0 l' u" y+ j

  • + s9 I6 u- U4 ?( Z' [% k5 g

  • : |: |5 T' w  E0 j# i1 ?7 f
  • ( _( F: }) p$ a3 ]7 Y2 i
  • " n1 c8 `" D3 h2 ]
  • 9 g7 J+ o. E& G+ G$ u

  • : {/ A& s7 P' s8 Q

  • - u; D' ^! x$ j2 o6 |" C# I

  •   S4 x: l! J- A& h+ }; c3 y- q

  • / q% r- _; H- n7 X# A

  • . ?$ }5 h* d# x; W4 y3 y3 j. G0 y
  • / J) W; w  V! }4 p: P

  • ! j6 h0 a% E7 z! y* N, W, S

  • 2 y  F  r; a% _1 _' k
  • 6 N  o' O( ~7 I4 S4 U: P
  • ; l7 M# D8 [8 r1 o) N( Z: q

  • : a) n% z$ u" G4 b& ]- z6 u9 J
  • + F2 F6 z3 i- h( y: p& w
  • ' O: v# d% U3 e# u, b
  • + S9 B1 w9 Q; X4 p: l& i9 B
  • + C( o5 Z% u% L# f/ U- c

  • 3 p' `$ t/ w  Z* @* i0 Q% ~5 E/ B9 A- w/ f0 y. @

#绘制中国区域基本地图轮廓,包含省界#引库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"). L% R" \! v0 v' H/ l. K

. m6 x# R3 l& @* e% o' j2 Q

/ q. S, t% s0 ^/ ]! k- U% j

例2:绘制中国区域基本地图轮廓,并标记各省会城市名

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

94f97fbff67b1f3a035f23ca0cb510a0.png


4 ?' |# C) m# E! Q. ?. l' B

  • 6 i4 Q7 I( }( ]$ }, j
  • ! ?) @3 G, B  m' y4 z

  • ) p3 V1 F8 J4 P' w3 B! a

  • 6 N$ u! J; u  r6 T: k1 P
  • 3 r# c/ H8 u! O: o" s

  • 4 t3 I& a+ f6 n! |* F, {8 f$ Z

  • 3 t4 c8 q2 T2 i! q5 R7 ?

  • * d- t* e' T8 c2 H$ V5 W: T9 w

  • % z$ z4 P( C$ e3 H) t3 x% f
  • , \$ ]9 q8 l+ [0 }0 X+ Z
  • / j$ E8 j, ^) n1 ]2 f0 P; y$ x- U
  • 3 K0 w/ W5 d8 Y1 K2 A+ r
  • / m0 r  J' u7 T) i9 l

  • + d6 A- e, ~+ L9 A$ {

  • , W5 H5 @( G8 f- P9 ~6 ?: w4 n
  • % k5 ~1 ~; Q& }
  • # h' y2 b7 a6 h# i/ X" M
  • " l1 F* ]0 `2 y1 d/ t  j

    . ~$ e( @, p1 D* a& P+ e

#绘制中国地图,并标记各省会城市名#引库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")
" C' r" x6 \4 l- n  Z

5 Q& X* d# Z4 q8 N' w% N" W
$ {! m/ Y3 z! c9 |

例3:绘制中国区域地图,包含海岸线

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

f5c3384582002193c2c6c354a3d26729.png


) a+ h/ Y# e6 y/ k/ z" c
  • 8 R9 K  D) z' f) s6 T
  • , d6 B3 _8 ?& h2 T, H" s2 f

  • * \" {1 |+ e; n% C' A' z

  • ! ^+ ^9 N$ g, q* C& h

  • 2 s  [9 U" r* U% z+ \
  • ) N$ Q5 a8 \* W' l; ]/ B' U: a

  • & E& ~6 h4 r0 y6 r" \: q
  • 0 W) I! G& d- f- j/ a) J* _! U

  • ' x7 m$ Z2 u! F2 S! b" |) E

  • 3 p8 _! E$ |1 L6 V

  • % f$ b7 f8 `" t# L4 C
  • 3 o8 b7 P0 ^" D$ X1 C! V( ^# }
  • $ Q' v$ F8 A7 H* r# }' p
  • - Q+ C8 F- y% {# M8 c
  • 3 R- |2 Z' c" N+ R' {) Y

  • 5 D6 u9 k) U9 c8 }3 m1 A
  • + r. R* |# ], U* h( j6 l

  • 6 O2 f, t8 k$ o! {+ r

  • # w6 w5 Y4 t; a4 k

  • 3 O" Y1 a" X( J$ `- P  Q
  • 5 q3 {& y6 @9 O. ?
  • . l7 L5 L0 Q- m4 p
  • : j% D. o3 {7 c8 J. Y4 D: c
  • 8 y! N8 |. s, f

  • 6 l+ [! m9 h. ]% n4 L$ Q  ]1 M
  • 5 c2 j$ Z/ `3 ]3 ?7 n
  • 9 k/ e2 T% u* [" Q

  • 7 T: u- K0 h6 `/ u# n% e; q

  • , V5 x) o+ I+ I8 k* x

  • " m! ?7 ^  ^$ q7 }  c  P7 @2 G
  • 0 j1 p6 F  v" S
  • $ P" s) K8 c4 O- O- K- a# q

  • 8 [1 V0 i( r* I  B8 ~
  • 2 h# y5 V% k2 j" ?

  • $ K6 N2 L2 M6 T+ q
  •   W2 I! b  F8 N5 q! \. C

  • 3 |9 n; T* S: Y7 ?* A, X

  • 8 E7 M; H, v$ j+ v) o4 [

  • : p( l; ?  E% R1 I9 D

  • " m' w5 g# i( Y

  • * k4 ]; K' g4 l
  • ( o% ?5 j: X. m  p

  • # ?. h0 o8 p7 e8 Q: g9 P% [9 G, o
  • ) _! M  }! j) y. ~1 R8 k$ T
  • 4 R9 r. P2 `* y4 ~  C8 Q: e! |& O
  • - D$ ^# u8 o: G& }6 \0 n
  • 9 ?7 C9 a  g. B+ d

  • ! U/ N2 B+ m& R; ?/ I% w* n9 ^5 i
  • # S9 O& D/ s. d
  • 8 q; F2 G$ h5 E+ A6 w8 w$ Y/ R
  • / c5 c0 k) J8 u+ ?
    ! |# R% S4 ]7 ~! }/ @" o. U

##绘制有海岸线的中国地图#引库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 A2 _; m  w0 r: z

2 _; V7 G8 ~! L0 r: q2 k+ M

5 n8 {. Y. [! B6 X( V1 q

例4:绘制世界区域地图,包含海岸线(中心经线一般为本初子午线

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

28af454b4567839d9c888c0e3809708f.png


4 m2 Q: a! h/ I' Z' I* q

  • . R6 e) Z1 r" [: n9 g0 Z8 b
  • 7 w4 [% X2 k& N$ ?( K

  • 7 h& S; @, m; M6 ]4 b; c4 A
  • , V; q! b: K. A9 M
  • / s8 G- s7 G9 |
  • / J0 [. j1 M1 ^8 \+ l' x
  • 2 e9 t$ c- R) Y; a
  •   i' w8 q5 }; B8 d3 b8 }
  • , x+ Y5 l' K, N3 @1 I

  • . m- r! e+ o# B3 C) v
  • , U/ m0 N" N& b3 l2 K& M- s# N; e
  • ; J- ~0 M) ^, D- C4 l/ o
  • ! Z$ G4 W1 d1 F4 k& W
  • 3 T) W" N$ y  n% f1 l( T; E! w
  • 3 D# q" m7 L" O1 H

  • ( h3 h4 v$ W" a" @

  • ' _+ U8 H, x( W$ B% @2 {- q

  •   o3 x0 u' P3 X# t  a2 s

  • 4 q* i- _: s+ H2 F" `

  • ) n! x; P# {2 X

  • * ~: q- x% i* \: z) k: q
  • 6 J" K, A# a0 b! s$ z3 F  l, l
  •   y+ h9 h% \5 B3 j8 c9 k# ~; m- D
  • / G- q( g0 x# o8 `- T0 c$ V; J
  • " g( `7 W* ^) I& S, I

  • % k2 \  u- A3 Z) i: I& q8 A8 o
  • 1 f$ O6 g/ z5 t

  • # o4 O( _- w0 q3 E: s% w' H  _
  • , O8 r% o# m. D* v/ W4 Z, v

  • 5 F3 X9 ?$ p4 Q( b8 n7 {  @
  • 4 A# s. W0 ~& V4 E3 W. ^

  • & Q5 X( S8 ]! t

  • 8 m( ~3 O0 g1 ]* k! ^4 Y0 ?
  • ; h/ x& _! }( O- l8 q# D' Z
  • + p( ?1 A! J8 o' B0 }
  • 8 ^7 f4 N- h" L4 `: A3 ^1 ?, z

  • % G2 w7 @  Z0 B
  •   j/ _! S( n; N6 i6 |9 K

  • : o8 h. r- f9 M7 q8 `

  • ! f  l% ^: Z$ k
  • 2 s+ w& m) m) h! @
    ( l; Z9 F+ @. P6 L7 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))
" p5 ]& Y. u7 i. s/ I

1 C5 S; q5 p8 R# a$ C$ U


. a+ ~9 B+ G) a                               
登录/注册后可看大图

例5:绘制世界区域地图,包含海岸线(中国移动至地图中心

(如果没有下载相应库包,请先在anaconda或cmd命令行去下载!!!代码的详细说明已备注在注释中,不再额外赘述。)

2368bedc57620857d0a0289ff1b1ce2e.png

与例4不同的是只需要改动:

proj = ccrs.PlateCarree(central_longitude=130)  


3 W4 K7 e; A& e# K

  • 9 t9 b1 j6 a3 y' A4 m( Q9 u* ~$ J

  • - l( A5 I9 |. a% d5 Z
  • 4 h. K( J$ _# a) W3 }

  • 9 N/ m# Z* \0 i8 ^( m1 n
  • ) w5 ]9 {# v- S3 H

  • " _( B) P9 w5 Y' G1 x$ a

  • 5 }; C1 e+ M" H4 a. Y' [. C2 |

  • " I% U6 |- D1 E, {% V
  • & L! ]( N0 l7 T: r9 ^& V3 Q) b
  • 8 X& C$ k" q5 B  y5 C+ [# @
  • & t; b  n' F( h  Q; p# ^" R$ J5 V
  • ; Y" @& ~: c( M3 z& g' R
  • 6 f8 W3 \; g3 g/ j9 Y3 z
  • : h) k' M9 K$ g1 C/ a4 I/ a
  • 8 ~6 P; a6 k; Q! L9 w

  • 2 a+ J2 R, l% G, l; g
  • $ {9 z, n5 k, |) k; a  o

  • 4 x( q$ u$ o5 W2 q; R
  • ! H+ H5 D% O& K0 _  Q* f5 ~2 y

  • ; S9 I4 m8 R) l( b, l- h

  • ' M: h' O- Z. A- a

  • 1 {, J6 T0 \+ f! H. J

  • * p1 \2 X# ^# _8 A/ c0 l  B
  • * i  `/ U' h% }, K  V3 r! y% ~3 c$ n

  • ( \& P. Y8 S7 Q' R
  • ' H/ Q- J7 n# m9 F2 b. n8 Z" x

  • ' y: f9 e8 s- I, @- _8 X3 J1 C
  • * z3 o# o' }; ^" Q# t7 g3 L% g9 @

  • % ]$ t) @: z4 }. U& D) v8 K4 b& S1 A" o
  • + ?8 V) T5 r) I5 ]  i

  • * s8 R& Y1 V0 N! c! T" h4 Y3 E
  • % h* ~% a3 ?3 B7 a

  • . _  Q" S- m$ |* n: ^

  • . j$ k  v, O. W
  • + Y, [1 I/ N2 M# E. W

  • 7 J; [- t( j$ ?. \$ e8 e

  • % p+ i; {! v9 Y( R% c; i4 @  m" K

  • * |5 \' d  }, b1 E- }' o; _4 \! S0 u
  • ! I5 D5 f9 S9 V

    ; v* L$ d+ m* \

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))
2 t/ N- H, @9 E0 K, w. S. g

$ v6 T* D" M. P! O% @

6 S/ G/ Z' J& L- A  V- b. [

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


$ d, Z3 a$ {6 w9 q% w, i0 w6 `
. ?2 ^# ]! c6 d8 _
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
有风
活跃在2022-10-29
快速回复 返回顶部 返回列表