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

    & C! Y3 p6 c/ y8 x& o5 d

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


7 g+ D; F+ C- N1 j; O                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 9 O+ G# [- d  X  R* t: g  R( v  V
  • / K6 _$ W; Q0 L; o8 p; I, Y3 ~3 u
  • 2 T/ }' x/ s: ^  Q
  • " k7 _! `# y5 K& h% w/ C
  • ) @. x$ O% N1 k/ ~! [5 @3 _' }

  • * Y5 V* `7 z# X7 S) @+ o- M5 |# Z9 Z

  • 8 |5 D0 v! W0 A9 X! j

  • ( Z  B; h4 ^9 j# d* `
  • % ^6 Y9 N/ G6 f1 }9 D. X2 L, `
  • # g* x7 C$ c) K( W+ q& i& x

  • 5 J7 a# }, c8 p

  • ! n  ~) _/ ?7 O+ \

  • / E; Z) j0 W+ g( ?

  • * u$ Q1 D/ J& n9 m

  •   P0 I+ ^: k- {+ t

  • 4 Z6 g% E! e) G# v- p  D  u* T

  • $ i/ X& ?( d  H! T7 F5 n/ k! d! Y
  • * F* a2 s) {: }: P1 z/ R
  • 3 I* l' }( B  ]( O2 X
  • $ T* x% I7 Z8 `) G6 o' i* f& G
  • , R6 f7 H2 E4 Z8 O: o$ U

  • + b( L* h2 W$ i8 ]
  • + |% L/ K( J# `

  • 8 M$ V" }. m: t4 v8 Z
  • 1 T9 W- g- E  c& |) e( l; T

    8 s' u2 z  g4 b) G' l

#绘制中国区域基本地图轮廓,包含省界#引库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")
, {  H9 }/ y. c# V# N


. C6 f+ C; ?, [, _1 e# \! i" s( j& V' W2 `% p

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

+ |4 Q2 [# J& ?2 g
  • - x, W$ A" M. Y# f

  • : k0 q  {8 t" E6 B3 {" h

  • 3 X/ U4 ]5 `4 m' O8 E; L; ^' z5 H* v

  • # p- G( i8 e, _; O7 t

  • / n4 Y/ l8 E, V0 E, {/ z! g) N
  • " R5 A0 x5 c$ ~4 ]" D
  • 9 R( C9 B( i; X% x& h
  • % B. g- C) [+ ~2 y6 I
  • , o5 V  v* A5 \5 x% T6 @
  • % D0 j1 P& i; ~0 k# C: m! M0 c

  • & t8 q4 I1 r: P$ l: R
  • ( J; X: [: C6 }, f# \, c& ^6 ~5 ^

  • 6 M1 P7 \- h8 w6 h3 p+ M# t( k
  • 6 K" q5 p- T: N# d9 t) {  T

  • ; m2 l" u5 w6 @6 v* p+ h

  • - t  j8 b3 k- |8 w2 H* E

  • / u% f5 R! ?8 L

  • / W1 ?; Q. D; Y* L6 c, `. T6 p# V8 e- N* m' Z  a

#绘制中国地图,并标记各省会城市名#引库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 ~$ K. b$ I! G: \! h, S: o

7 I5 v8 C( d. c; m
- |7 R( U* ^% ]& i

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

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

f5c3384582002193c2c6c354a3d26729.png


# j+ s; N6 G8 A( C! H& C2 V

  • / D, E! S9 T" Y$ V1 W
  • 3 `- k4 d/ ]& v+ U
  • : s+ `1 j; Q, t5 U
  • . U7 F3 L# O* s
  • 1 \  ]. F5 ^; A- Q6 j
  • 6 S; J* v6 E: p( a2 \! P2 c
  • ! K7 l# @" d4 d* j8 ~" N
  • ( {4 f$ ~- t; a# g1 `4 B

  • , @+ X( x5 a! h# M: K

  • ( o: c, A' n( @; y: v

  • , O  k" s$ K. d7 g; P
  • 3 Y. `6 z) }0 F, K5 B9 Q

  • 6 M+ K" T% U5 @1 W

  • 1 C' k! k. U6 z  \, S5 A" m

  • 9 N) s* ?( K- k+ p! H
  • , S) r2 _" j- ?( u9 q3 X8 e

  • ! v3 I: {( h) r

  • & _! X1 X6 W/ y- a% Z9 s5 i6 x% p

  • 4 u+ Z1 R: `/ J6 v! B( w
  • + X- J$ |7 W1 r, T/ e& i  X$ O! {# I
  • + i7 L6 X$ L" X. p5 `* K

  • ( N3 n; G+ C) I  d
  • # b' e6 t8 l" X
  • 9 U; T$ V  e( z) x

  • . M+ x0 M* T/ O3 H9 R$ z5 \' X
  • 3 }/ u' d. n  W) }6 _' M
  • / V& [* J4 B6 Y. X

  • & E. k/ `! N. ]5 t. _% l
  • / o6 u. n, |7 U9 t

  • - e6 w- e7 U+ n5 Y

  • 3 l( d3 v. D# C4 I. v  c

  • 7 f$ q+ [- e$ @7 e. r$ }6 o: l

  • - O, ~8 a! y- k7 o& \
  • . d4 a6 `0 k9 F+ G

  • . E( N; e, ~- r5 i7 `# n" f9 A

  • 9 U2 D# o+ R+ ]0 s
  • 1 x$ M4 b: A  c6 b( Z7 S
  • ' ?* p. y/ S3 ^+ N# P5 }+ N
  • ! e6 i6 j; O$ q3 B2 K- q% ^# f
  • 6 s8 r" F9 P$ D$ |5 O' w% n
  • # S; w' m& Q+ n& e% ]
  • : ]# M3 S+ N) G8 c1 [5 _7 `
  • $ q: V' E9 \* C0 u
  • & G1 O- j2 v0 ?* {+ H$ q& H. Q
  • + }- R" e6 O4 ^5 ?! ^+ y6 U: J5 G
  • ( O2 u% e) f( l; b( j: u5 P$ o5 ?

  • 8 r  `+ q" B9 V9 e5 E

  • , s5 ]/ e7 Y  W- Z7 y

  • 3 M0 v9 ~0 X# E3 l

  • 9 S: H  ^& A6 S6 {  M
  • ) v' f; n9 I  t# }
    . N5 V8 q, }0 H% p6 A( 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 Q6 I0 [- b+ z

- f0 o. s0 j$ T6 M4 l! d4 I, z

8 A& X" ?* F* J/ c5 \

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

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

28af454b4567839d9c888c0e3809708f.png


, m6 w* r+ |6 H& N
  • $ \$ Z2 ~( D" C8 ^/ k/ c
  • ( E+ [0 Y6 A: J3 ]

  • $ v$ S# d' h: l' q) q

  • ' |. T' E# F: d9 Q7 h6 P+ G
  • ! k8 d7 _+ V% F0 y$ X1 N* C9 y

  • 3 b! M) X0 s+ }. j$ i: v3 p1 j

  • 7 B. q& Y: _- M+ A- }7 v/ L
  • $ q- U8 P! V0 a0 w, u& [. T
  • 9 h0 r. g) p+ J" ^/ q) A+ Z, y" f

  • ; _0 p* W4 T" h1 @. `9 G% ^! N
  • 5 v. g% T, g5 B6 X9 F/ h! J( {

  • ; M2 G# h( ~' H, U
  • ) E- |: W6 B6 J/ Q) {, |
  • ! g% }# z7 p$ J& M' {% A- c# n, a

  • 5 q" s. ~9 ?' s8 f" e

  • ! g( Y* w' Q& S

  • 9 I" r+ x5 \1 V* ]$ a, ~$ z9 X
  •   r& _! f" h. k, p* e) y, Y: x# e

  • : @8 ^% b" y6 s4 x# u( M2 B0 q5 t

  • 3 G" J' o/ E1 n. `$ W* R0 ^

  • ! `9 T# W' w) ^2 A5 Y8 Q8 s: ]

  • * l: g5 |" |1 V* t

  • 1 w: |2 C/ m0 d) n) N& |% E
  • - d6 B. ^' q& h$ D

  • ; `2 P) S" [- o' Y0 G) u6 t/ ]3 [
  •   g4 b$ a% K, t7 o% z+ N' c4 U9 d

  • 6 x) ?( B7 c6 L5 T- P0 z
  • ' i% B; B6 e$ ]- P6 l+ i

  • 6 U: a, b9 \9 F& i6 x
  • " C* n+ E! l/ h; c4 f

  • % Q% g0 u- J! J! t+ a

  • : M( u5 p! |* d: ]5 T

  • , B5 G; e5 \# I, }& O7 k

  • ' o% o- C7 v1 m

  • & I3 j* n' F3 B) b
  • 2 z: g) J/ k- h5 X4 A% s- _: B
  • ' U$ ?! f) q) R
  • * |" t3 N$ O+ O8 q" _, G/ p" {
  • ' |" k9 c5 d# K; g
  • 5 o8 m1 Y7 {9 e" ]/ n7 I7 Y7 Z

  • . [% R" B3 j. r" ~5 q0 V" p: z" j; q- d$ }" V  k. }

#例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))
& z3 B* t- k$ h2 `9 ~8 R8 _


) a, t3 [8 e6 D) L3 z


  N' y  F7 Q4 h                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

# r: ~5 Z) o* G8 _- U
  • ; m2 b0 G) t& W- ~7 c8 r+ v
  • ( V5 c' D; q, h$ @
  • 7 Z9 b5 \: L& _

  • " @. J+ ?) O3 Q- k/ {

  • 3 A, m5 K' x% W. Y  E7 V0 D

  • ; [4 t3 C% m8 J" T8 G, ?

  • & Q7 i5 T) g0 T* A4 r- F* o
  • % h! M; U3 J  F+ F$ W- y7 _
  • 2 o+ ?7 N+ i8 o( ^

  • ( K; u9 u2 }; A( o" F+ |; y( g$ N

  • ; t5 G: q' ^- e. L

  • 3 C6 X8 }8 v: }) r% N( j
  • $ F! T/ B" d9 r8 W2 v/ Q) P
  • 3 J/ a7 @* z3 B( d/ @& r0 S% Q0 n
  • : Y0 m4 J+ C$ p, h
  • 8 e' _4 b# O$ \! D0 W8 s
  • ; l, v5 n5 Z9 o! o2 G+ n4 u) M$ q/ e
  • , v2 O8 D. a& ^. L& W0 ~/ v( j

  • $ @( }. n" q5 m

  • " R# m" k4 N2 D9 M; r% M

  • 8 ^8 `/ }+ T, c7 E5 Z8 C2 _+ n
  •   k& P4 d  i5 N2 Y3 e

  • % k+ r' t" ~. R* V
  • . z! x4 ?& D/ f: g/ ]) S
  • * V* M/ m3 y- A
  • 9 D/ g, G" E6 |& j. U4 s( s

  • 5 p+ i1 Q( o$ [, d1 R8 E+ [8 R

  • 8 J2 o: Z) v; n9 \, V( A

  • 6 B( H3 h6 e3 U) b+ O$ i/ a- P/ p
  • + u- J) }0 V2 ], J  R, C3 o

  • * k* L$ Q5 q7 \5 D- S% G

  • + a# M' H9 U9 y% A# f5 V4 F
  • 3 Y0 |+ }! M3 z7 ?1 L* A8 {

  • , c# _6 o2 _2 V  r, Z8 i. i2 `( o
  • , I1 b- G) L1 z
  • - s' u) n9 r: h

  • " R5 G5 U" |0 G; _% v6 J! ?
  • 7 _! W1 O- I& W- P$ m
  • % Q0 A2 W2 V" f! W
    ! h  B8 X/ ~0 u: ^1 k

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))' D/ w1 P9 w" X( c$ a


1 h0 z4 t0 v7 f0 y. x+ U5 y7 c

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


( u. T2 ?0 M6 f2 B" y0 H( Y. J$ m% R- Q+ D

相关帖子

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