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

    " L3 G/ B) ?! J2 h

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

% t- k- i$ e' [7 T& J: Y
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • ; s0 j; X4 g' R6 P! ~
  • * _/ r: S* s! j0 o; ~9 c
  • ( O& T6 Q* v. d

  • / m. d1 a+ C/ `. k$ }/ s1 N
  • 3 g1 T; P, D+ a- q

  • 4 L, B, I  m- I5 a
  • * z- s0 Q' @( f' g4 H
  • 1 Q. j% j/ {/ l# D& B

  • 7 l/ Z  w7 b8 u  S% _
  • : C  y, b9 ?/ s5 M  C
  • , E7 j# y" K2 @6 p; I' b- ~: g

  • 7 _% M6 o6 e" u% O3 Z8 `

  • 7 H4 P7 C8 H1 o: q; }# M2 v% a
  • ( l& q4 L3 E/ P) }
  • - c8 ^3 t+ d* H, i; ^8 M1 E
  • ! s- b1 {) F( k' B  }
  • 9 r; O% `8 {- j& @

  • ' ]9 \/ \. \* X$ `

  • 0 k. ^! N# o5 Q5 f; z
  • : w* p, C0 u; x1 v! j
  • ! j- Y$ ^/ i0 T! t
  • 3 `- |- C# ~5 {4 b
  • ( @1 C, }  j0 @+ n, M& N* j

  • " h$ U+ n1 w) c& E$ N

  • 1 {1 r/ N* P, j
    1 ^/ R0 o0 {$ _# j

#绘制中国区域基本地图轮廓,包含省界#引库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")" v- H/ N# v0 Q1 ]! T1 [1 N% O* k


0 F2 N9 n& {7 P' j5 H! ^( c6 B
" K0 z) T) N$ I4 N6 c7 I: e/ R

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


* i7 h, Y) o0 g6 j; F- q

  • ' C* o. ]" \3 K8 N1 U: `. P

  •   n; Y8 {: m2 Z% o! G! c. t* Z) D1 H

  • 1 v! r& [5 b/ ~7 m5 ?

  • . V% c& e, \8 @" F( Y; T4 H
  • / c( e* n: P0 \- ?( g
  • & k2 `3 W8 a7 j9 ^6 i
  • % u/ i' M8 |# h1 \" |
  • 9 w& ~0 a) k1 Z2 W: Q! S
  • . C6 {: z8 }0 D7 z* A7 W

  • ; C4 U/ C4 Y, B/ C% L1 a2 \
  • 7 J: \% x5 A& i' [, E5 G1 u$ b

  • 0 m0 C: i4 ^0 H4 E2 ^& d
  • 1 C" ^% T7 F  B) {

  • ) ]) D6 c- D, h! E) I6 W5 @

  • 9 a( [8 W5 H6 I  ?; ?8 K

  • # y  s% ^+ F( a% j# D" A
  • ' z* G) }/ G( Z! g

  • 3 f) g  {8 x& l: y% P% f& s$ Q% f* R& q- ^  s; z' o

#绘制中国地图,并标记各省会城市名#引库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")8 F3 M& y+ h- @' w


% V* T" }: z$ D0 T4 B" h5 n' n
* g! b) G0 S8 X! i) H  p

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

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

f5c3384582002193c2c6c354a3d26729.png


) B) ~, k, B3 C+ t

  • 2 L& q2 ?9 r2 O% g. u% l  \
  • # G& b# ]" g* [+ Z9 c3 s

  • + r0 x* J( z* N. g' I4 Z" w4 U

  • ; ~/ y( ^" K& }  P- w$ i
  • 5 o+ k! u- S% [
  • % z, W* q, k* [" U6 f

  •   o8 d" c9 `& l! y

  • 1 s# j5 S% t( N* s

  • 4 H0 h3 {: M/ u! P
  •   s% A; \' A" @
  • ; e- c, H' x4 C+ V2 a; ?

  • 4 A& _; U# Q2 M6 [/ A4 P

  • ) {  l. Q! Z5 G- L) s9 z
  • , @, G: M$ o* n+ F# B
  • ! O! t- H) ?# Q8 S) D

  • * @% ~9 ]% T3 I) ^# C/ y; }3 \

  • + o% F/ R2 A2 ^3 ~' ~$ J

  • / u7 N$ a; W% F- k: z% Q
  • , k4 ], p3 S7 T. J

  • 0 I# v) C" C' S1 D" _# i+ C/ |

  • 9 H+ X3 }9 o1 s) U7 t$ ^/ I' F
  • 2 z  C: o5 G+ z  A; i/ ^

  • ( S+ G; `8 q. ?0 y# o

  • * e9 c" A# s) [" m+ A; \) s

  • . F% N' G! R* `: g$ Z5 ^
  • 8 Z  s$ n# o9 C; e, H! r

  • 4 e8 O5 \& H% i( b9 p6 _
  • . F" c  h4 c2 @& B* Z
  • ' I! n$ s# R5 H6 O% [# {

  • 5 \; U: c" L2 w" A* Q2 V

  • # `0 h9 d3 B/ b8 i' u$ Q2 y; Y
  • # x7 B1 ?5 y: c9 G! z8 v
  • ( ]' S2 J1 t) }# K5 n7 y

  • / `5 `) D. l* q% [" L# Q( |

  • 4 h+ G4 h2 _& {" H& N& Q7 H

  • 4 X  o* J5 \/ |3 s7 O

  •   @! R& D/ B/ m/ Y( L

  • ' k& L9 c1 D+ ~/ r3 c9 Z

  • ( f3 G% ]0 Z% ~9 ^- s
  • 7 q$ R/ A* ?: R( S+ T) i9 t

  • 5 ?( L2 z7 M0 u5 A( S
  • # d: b7 w7 g+ a3 d& `: @5 @
  • ! ^1 ?4 y% V( F; J# k

  • 1 ]2 e. u; G5 Y: q7 |
  • 3 M" ^  N  K: A7 ~. Q

  • ! q' l/ y+ W  Z/ V
  • ! I. O4 g( v# i* P7 j8 M; j+ i4 _' ]
  • + o6 k- K: U2 s5 H" W
  • ! l* B9 S5 s/ ^6 \+ s2 F1 w

  • $ n+ d" b  o; ~1 N
  • % {& d% V' ]9 P" b
    5 ^* L* s: m8 A

##绘制有海岸线的中国地图#引库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 ^3 {* c8 E( S


" t; E  {, `' P/ @' F6 |! m+ a- \2 }, J# w& ?

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

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

28af454b4567839d9c888c0e3809708f.png


9 i. D/ l1 g2 v! `* H7 X
  • ) ?. {4 P. s" _% @+ f0 L. T* f- A$ Q

  • % l& i" f# H9 S6 N7 Q

  • ( w3 s" w' z. {+ ^1 i. S- M

  • 2 e- x+ K( _& q4 h! {9 m8 D

  • # S$ K; S: }9 ]3 C8 E  r# b0 T
  • * `/ s/ }( x/ i  h

  • / Q6 x$ E4 ^' g1 S, S3 b

  • 1 F, P- a+ U0 k4 {) h4 y8 x" y) R

  • - e  x1 [# t: `" E: _' E

  • 1 @$ P3 w8 F) }8 E: n

  •   [0 R3 E. L3 G
  • & ^, `7 N% t. G8 i+ Q4 S+ E: s" y
  • 5 ~: y8 }4 i2 A7 U

  • : B: Z+ n6 W0 v, G
  • ; o( w7 f5 ?% f1 N! m) F4 O' I

  • 4 z2 j- U. H9 s7 h& `
  • $ ^( I. B6 M0 g2 h$ ~0 t+ r7 q+ @
  • ) c) W9 ~# [) c" D! C: g
  • 3 W+ f" N7 B1 m! X

  • 3 V5 K% h' Z0 m
  • ! o$ ~+ ^7 ^3 V3 ?. R& N& u

  • 4 b# L; f" ^( X9 L  Q9 q
  • 0 @5 J# C0 f) H# _

  • 0 L6 Q1 A8 V" g
  • 5 l6 g( w2 ^; R7 r8 Z5 M4 _

  • # M: Y% I' T1 Q( Z3 z

  • ! p# t) x6 X: M) O' ?1 O
  • $ a( B$ g$ h" v7 j, H6 s0 D! m/ g
  • ; q( \+ h- d( e; m

  • " ~) h1 H; X. i- q6 Y0 e3 b! M
  • + H5 m  c( w, p+ ]
  • ( O% u7 Q' B7 k( P9 j& r* v+ x. h

  • 8 X) i' Y5 Q" \3 w% Z3 F$ X

  • ! f% Z  |9 }# \" W' J

  • & F) d1 }2 A% k/ }1 }- B

  • ) j2 x# R4 ?$ c& K
  • / I5 X. o' j7 g* u4 g# c

  • + S2 A6 S+ g& D

  • ' @- v$ k, s* Q: a/ }1 q

  • 7 v5 l* L& h* i$ c5 F1 b% P

  • & I: |: d! t; {9 [  R; c2 x! P; O0 P8 q; i- X. Q; Z! u; Q# y9 z

#例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))
/ ~2 j3 C3 i' D- K' D0 [


: w  A$ M, f5 z2 D$ o


4 m: f" W7 e# k5 {1 Y5 ^; ]                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

$ U0 C; p% X+ l# n
  • ' Y" m! @6 h! t) b

  • ) ?- K0 h" g( z$ X( z8 S! f

  • 5 b7 _# L( D; B! _
  • / U7 I" W# K* |# m! @

  • % z, ]( V/ C9 b$ t; H; }7 u1 M

  • : T6 w8 F2 ?  E1 f" N4 Z# c

  • 5 M' _% g; I3 d; c. b1 ]  O$ K

  • : `7 |5 q% N. D! X5 Q$ A# U8 \( ^

  • + ^8 `% r! y$ m

  • ' z$ x% \. \  ~: M' i* E
  • ; a9 o0 [. b: a. j
  • & I& X8 s; I/ c3 [4 _( C+ a
  • / q( |. }  O: c- [
  • - s. P9 M9 _+ f" R+ h2 [2 ]. W) r
  • ; k1 w! W2 u: {" _; ]5 |" V

  • 1 G& E0 W1 w5 ?1 A4 X3 T
  • 3 \- ]& d8 k/ q* i0 |3 K

  • * E7 l( h9 _- {2 ?+ K
  • 7 k4 }! D0 @0 C$ g' w

  • " l. M0 S( o* ^, V  v; b

  • ; `" [; ~: n/ D: ~; e

  • ! W# E/ g( P2 t" z

  • / ?1 F: R- F5 A) f- u! V8 K
  •   K- g6 E2 Q, ~4 J
  • - N/ p- q9 z. ]$ E+ X% T9 I+ q

  • . b$ b- t6 N  u) o4 _# G* _& }' S
  • ! Y* P  i2 K" W2 d# Q! B+ j$ o! d8 h7 _
  • : [5 ~$ z; O$ L* H1 W7 d9 f1 \' S0 L  O2 {
  • : y6 D* {8 H3 Z

  • ! `: b& t' n/ g: T/ D: j( N
  • " c% t; a. O6 p6 S: e8 N7 ?: v1 o

  • 4 f% d( t6 ~  r# C9 i9 V

  • " n. \2 r; i% e. t

  • $ G- F" M1 o% t8 J3 h/ v' ?& J! S

  • & ~0 \% z. z. p$ T; \3 m" M2 U: [

  • 7 y* {" s) @& m  ?  E. ]

  • + [# m$ n$ c! N! L& `3 z) R

  • ( p8 ^0 U! w4 B
  • ! D7 i8 g' j6 p! u" R* B5 G

    . d+ r& v9 x; Q7 Z4 ~- S

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))
1 S3 U/ W4 ~, t, E" ^

* M/ {0 K8 T' [

. x5 T; o& T* N

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

3 C8 O( S% a0 b. Z8 b: d/ s0 e) ~8 _

8 K0 Y# V$ p& y2 @
回复

举报 使用道具

相关帖子

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