[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("···")

    9 |8 c# ]6 G1 M1 Z* N

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

9 Z! x! i" C7 h
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • 1 ^5 E3 ~( y! B, c7 L3 a& r6 S9 e

  • , F: m% i0 o/ D+ S. E: c5 I
  • 4 u/ O: Y+ I4 ]; f
  • : S' x. J' `" i; S! w; p9 a# F

  • + s$ D# Y; y. ~* c! F: @" D* L3 Z

  • 9 ~% `; J  A- Q% _+ Q
  • 2 p) r% {* r  H  R0 u
  • . L! b6 _3 Q: N/ G
  • : |5 ]3 p) l, x" ?

  • & O# _: `9 {, w' r* n3 _  z/ J

  • ; m! g7 p- X# S; U9 C7 Y

  • ( l$ K* i. l9 u( j1 i

  • ( o% K; V( T& A, x" b5 X' ?

  • 8 E$ P% F$ h* c

  • , p2 s+ T+ H& f! [9 P8 B' u0 g
  • # |* a# f' }1 W% F% t9 J
  • ; N9 Y( I4 d5 ~( u. [" K- s
  • - S8 d, K" F7 `6 ]7 x

  • / b& W# ]% D' X4 U; `. N

  • 2 X, G( g' G& \5 b# f. R3 e2 o

  • & g! \  }& c8 e

  • 0 ]8 `8 y3 |8 T$ \$ q  P( u; |  a

  • & f/ ^8 N! V9 ~- j7 {; \1 E
  • $ B( |( M) i- t- v. j

  • 8 P9 `" E* U% f% m# ?0 |  ?0 m3 o3 P6 w) r/ x

#绘制中国区域基本地图轮廓,包含省界#引库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")! M5 F& m5 V, s0 Y: V

3 u% s6 u0 ?4 ~9 C" A
" J3 `$ E# e+ K. e% T) G! Z$ `

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


- @: z  K5 V: W& ~. `( l7 V2 C. k

  • $ Y0 B4 v0 X$ H) w

  • - ~, L; F5 o. z( W1 q
  • 3 w' S0 U8 ~) Z4 ^" D) k# M
  • 9 F9 Q4 t$ @  z) V
  • / J% E* ]/ x& q- }+ M. C( u9 _. N

  • 7 F9 Z/ i$ ]8 ~9 ~  k
  • 8 q6 B! E  S: U
  • ! W: E" x8 J. L  B8 ^+ k

  • 0 G) I6 q& w- }5 Q  c  A
  • , |- [$ f- ^! i& e1 W2 y9 X( ^
  • 8 Z3 w$ s: a2 l& G7 j" G: Y
  • 2 p1 Z& M/ @# A: l3 [
  • 2 D9 |. }+ J" d3 d) K* I1 }. w' B
  • 5 b( ]0 H2 r7 d& b

  • ' i( [4 _7 I4 B

  • 9 ]9 D  j$ v8 a  c# o7 Q2 x
  •   L6 i, n0 \& }& ?6 I

  • & e5 Z- i* a7 @  s- \+ r: S7 b8 \/ l- N3 m3 D

#绘制中国地图,并标记各省会城市名#引库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")
! a5 H% q. A! B3 M( L: V6 e2 Z


, i7 O2 T# t1 o7 f) D/ i  G
+ k" z7 m; r' s) e7 x" }6 I

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

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

f5c3384582002193c2c6c354a3d26729.png

% H/ d" Q, e0 P' J2 `

  • 3 X& ]# Q, X6 g+ T

  • 8 l1 t- @, a5 n
  • 1 @" z5 {4 t+ T+ j+ v, f4 r

  • ' s) Y7 e. w# h4 ]- N0 c

  •   o, P7 X' C& Y/ K5 b

  • 7 x. x. k, S) @; b1 k1 C, i

  • - L6 {2 q% K8 q3 Q6 r2 \

  • 3 ]4 f; {# k* r( z* X6 U

  • : A. [6 _6 @" u: _1 a3 l3 H
  • / o5 a+ ?; K# H9 O( u4 L/ c

  • - s# O; Y" ?# A. m: F
  • 6 L3 O6 E- F& `. Q3 V/ l

  • 8 w% o: x6 m+ d4 A: ]
  • 8 F# B5 M" S# t4 i" i
  • 9 W  T8 t  L' j5 b4 l3 ~

  • / b, t6 x% S' o& }# U' q4 z

  • " M/ @3 y, ]8 _/ j- o
  • . g7 ~6 k0 z& F5 K

  • 8 @8 U- y1 g: m1 z

  • 8 W9 K8 U- L0 w$ P& H5 d

  • 6 m: q9 e' _% ^7 H5 S9 H7 M5 @/ K
  • 5 H1 T4 m1 C! F* A* T: y7 e" q
  • 4 a! ?* m9 e: d8 T
  • ( F! I" `8 V7 z4 B
  • , G; c+ ~+ u; [. f, d
  • ' {, y. k$ u* G/ n2 J

  • ; ~' Z1 ]$ V" g2 p) A* `

  •   v- U9 F8 D# J- a& L
  • + f" z4 F: w% ]" [' S

  • ( p; b+ _% H& ^" h

  • + X" }% A6 {% |3 Y2 n! I

  • ) V: a6 _1 e: Z; l8 T+ D4 E& @
  • " k5 Y- T: T& S6 u; {; k& a9 J7 E
  • 7 D7 F/ X5 `% w% J2 a
  • 9 `" ~  v7 d- G
  • 6 U* i& @$ H; Y+ \
  • ; ^) b; m) G! h- b" y$ V

  • 7 L& P0 y* D( U, M* A

  • , A# X" ~0 j# E  s" l, k

  • ! F( U% r9 n* k- K& s

  • # b4 ^, I" ]% d8 q" o, `& g0 H
  • ; Z# P5 k3 A' n$ H5 V4 w
  • - C0 \7 d/ |" e0 n$ ^% T* D

  • 9 M5 O, P, V! x+ y2 \1 D7 M

  • ! Y2 q& \! I% i; l! x# z

  • ! I0 P. t, m+ p( u' o9 d1 z8 g

  • ! c6 h' U% |& @( D$ Q; C! o8 [
  • . J+ E  W4 }( n* d/ s8 f
  • , g) \" }& f8 A9 ]

  • " i1 {8 ]. V$ E7 E0 h

  • 4 d- p' u  o: z. Q3 v& l9 }# K. M1 v" H

##绘制有海岸线的中国地图#引库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()
: ~$ Z% F( [: I' c5 a# f, \


2 h+ L: i' h: K; Y9 l$ a6 C! [% D9 n  l. ^3 ^7 @( X" c( ~

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

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

28af454b4567839d9c888c0e3809708f.png

8 y+ v& s  p" a
  • + i3 ^" H5 d' m5 k

  • / d" C* G; E6 b9 ^

  • + \$ H7 `) g1 w+ D# j3 V! h0 c

  • ' m" r/ G' ?. k; d

  • - P, v! S, M$ _) p8 B; O3 L0 N
  • 0 p; n% n1 M1 Z, s$ \7 L; ?
  • ! j& [! L* N: y% W) U1 {" A

  • " b# R8 u  r& S& t( _

  • ( G& M+ E: R2 C( X) L4 e

  • + \" Q) J5 V1 L" W
  • ' [( ^2 \  j, C+ |0 X/ ^) v; a' g; E
  • . \8 Z) }% b( f3 M+ Q

  • 3 q* f7 R+ Z- V0 S

  • 1 M! T" C5 w5 ^* `* z3 v
  • ! Y- W4 x* E. y2 l7 e) {% ^& {; Z
  • % r) W* a) ]( ^# R" Q5 }

  • ( N2 A( y. n: E" Q$ j" g
  • ; ]/ a  `. I1 O, `% d

  • 6 N- `7 r  R5 x3 \" W
  • % e/ x4 T" ~  e# p) P

  • # j% E/ E( O) }+ B9 J
  • * d* x3 z+ @+ d" _1 n9 S

  • 0 I( g# @5 H. ^8 E: z
  • , o: A, L5 K8 V# n( t! T* \- U' `

  • - m( I( U. a% ^
  •   i% ^% Y( Z+ z. c, e2 X( n- y
  • ! I# S, }$ S. q3 k" I- W$ _
  • 9 W( m5 J: ]/ o5 l
  • " |6 H0 ~9 R3 o. s2 E
  • 7 l4 Q+ {0 I5 H" O3 ?
  • 3 c! v$ \! [& W1 z; [

  • $ }6 P  m) T4 e  Y) t" C
  • 6 g. d7 w; p8 I5 z
  • 6 o1 H( M5 r% R

  • ( `6 F" B+ c. K+ d

  • ! ?, c% X, l; _% Y0 b- q0 Q
  • 4 G3 ~; g9 D5 p8 h6 y; Q

  • 5 j& b& _! A" Q9 r' G& m- ?: D" n3 C

  • # {/ p) H. p5 b; ]5 h& k4 K

  • " Z' {( w+ G2 B, q  \. \

  • 6 [% ~# \: ^9 [7 }8 O1 m: E2 ?& a3 w3 \
    * r- O! ]/ D3 f# s" 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))
8 S0 f. c" F0 e/ t# y# a0 L

. O, @* i+ m: Z* ]: C* ?" J

! z* [4 U7 R! \% l6 P% Y
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

6 d$ r8 J  I0 u& q

  • 8 r5 ^- u! |# F: x! {( u$ ^! l0 b
  • & q% h7 E1 @! q) J' T
  • * v9 A" ?1 \8 k; i6 e# G- m
  • . V1 j3 H5 h& R, M1 k

  • 8 ~, i4 O! q: j1 s

  •   t% }3 m5 Y( Y- L, u! ]% R
  • 1 [1 S. Y/ {0 t6 r. Z) G3 \+ a

  • ! A1 V: W! Q2 j' ?! P! U- J

  • / ~' ?9 Q+ C6 M2 T5 |4 G2 k

  • + Y/ a8 [3 }+ C1 y9 P/ O4 k

  • + h# {3 p7 S9 b% z( i, J* R
  • 4 I0 m& D& L, U

  • $ S8 i1 O9 l; P5 l  E! z% _
  • ) ]& W5 [, O; j* f8 b& F
  • ! E7 `! D/ V4 ^/ t# h. A

  • 5 z* M  n0 f( B: p

  • 4 j; L* i" t( i$ i% z5 K

  • 3 c/ l; u1 Q  r! `7 |. i; A  i  ]

  • ( K. B8 D$ \( U3 W5 z6 j/ J

  • ; _' k- r- _5 n/ T7 D1 _
  • 0 g5 Y/ c7 G+ ]7 |3 b
  • $ L( T# g0 _4 j% A

  • 2 c- W# [& C) J) ?% Y0 R

  • 2 _( }/ s, I* p+ Y: E6 F. s

  •   {" y4 @. ^$ }: `. e+ |

  • 1 ^4 O. ?0 {1 y1 S7 c! I, _

  • 2 e' {3 ]! L' Q+ W3 {
  • 6 m) t7 v+ |# L; ~0 Q5 ?; I5 P2 ]

  • # m0 `. b0 q0 b: P% a( `0 s7 }$ s* h9 C

  • & F% z; S% K* B4 r0 L; n
  • 5 R* Q1 x: \1 S6 j3 J0 _& ^

  • - d$ {- |3 U; B; b2 N
  • , \7 R! d7 ^8 A& ]

  • 7 Y& _+ B) h4 y  J) k; d2 \8 o' Z
  • 9 V( w  j7 |1 u4 Z
  • 1 a/ E% O& l/ P! j3 h
  • 8 r, D0 a+ Q1 ~' i7 u

  • " v& ~! W) f  [5 w, r; n

  • 5 X$ A, ~: O8 Q) ?) o  H, f1 h% ~4 k2 U
    & [; g& j- h" V4 I

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 ~9 l  y( m7 _: W/ P7 K


0 N0 a9 V" Z; D3 g2 O: K8 _0 A' A# p8 y9 T

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

" [3 h3 _- g6 n" l1 }" V! r

, K; Z2 ?; r( z! n* [
回复

举报 使用道具

相关帖子

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