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


    " \! }) W2 a3 d3 x5 f& P* ?

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

" b9 v: i& o) S$ Q
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • ' E! F3 O6 `, X
  • / Y# f; R% Y  x' l; G
  • / h1 @6 O# y  B. S
  • * J9 q: W6 l0 T, q& Q4 |

  • ( L) I; z2 l7 Y7 \
  • , j- w0 I! l' S; |" `
  • ( [/ K* q0 R7 B3 r6 q3 Y& f) d
  • # H/ k: x% `7 G0 c( \

  • 0 }7 R3 r; r- t- `# R+ h7 c' v: G, p
  • 8 }1 M8 C+ K' w# Z3 K, s! K
  • # @% ?: |  L! c. ?8 h- i+ w- p3 L

  • ( R8 K0 @( S" T8 F$ ?

  • , v6 j1 P' I+ C, v( ^: k

  • 0 R* A" m) Q8 v# `

  • . Z9 P/ f* F( l! G8 u

  • 4 m& i2 J. M4 L& U: R2 i
  •   ?4 f5 U( H) H$ m/ t
  • 5 u# f; v3 ?4 I9 |* `

  • ( U# i8 _2 w$ W- h

  • $ n: r5 y7 F* N  \! A4 \

  • / f8 X: Z  Z7 Q1 X$ m! P

  • ' b! Z# h) q2 A+ V  \# B+ Q

  • + P9 z6 V. ]( n6 `

  • 8 T4 g& |  k/ R: q/ P

  • & K4 a% K; q) q2 n/ v* M  P8 a; n6 r9 @3 h9 p6 i- d

#绘制中国区域基本地图轮廓,包含省界#引库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")' y1 t$ \  T4 w/ f; ~% N

% r5 a3 I9 K: h1 B. p0 J

5 t: X0 t6 U% ^! c

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


6 B1 z2 G) o2 a/ T4 ]

  • - E+ a3 ]6 u/ Q: Q6 h; I3 a& [

  • ) I0 Y$ ]% h' n7 _$ w

  • ) d  |. L- b! B, ]/ b$ q: M

  • : ?/ E% M2 P4 x+ o
  • 1 P" w$ b4 P  T8 X% }" `

  • 4 i9 w; g& a* i; o' r+ @

  • % f* g. p& t8 w0 a3 M* f5 b9 @( }
  • 8 \2 }' C, S) g3 q( B' V
  • / U3 U9 l+ f1 n; F
  • " g7 v6 k' c$ `9 q* Z
  • ) j/ b% t3 K7 c" b" Z
  • 7 K5 O& j! N; l- z. ?

  • 5 |' {2 H6 O4 L0 R

  • 7 U$ @$ w- V+ Z# E( F
  • & b, V' }# p; _
  • 1 X& E7 Z; I& u8 l! D
  • / ~; \6 k. I: @$ `; k8 C
  • / m' R/ {! H+ r8 ?/ O0 C
    4 Y4 U4 p4 D- `5 C. s3 h

#绘制中国地图,并标记各省会城市名#引库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 f6 ^- q: A. N; E( Y


. \; x1 a' B% r' K- n* t2 d: ^' B. j- n7 r7 w7 c) d

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

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

f5c3384582002193c2c6c354a3d26729.png


; K# Q% f0 `2 I3 K
  • * r+ s8 v0 y" D- I+ _5 {2 N6 K# V

  • . [4 Q# h  d' ^/ A

  • 2 y% ?# {- \3 e" p; e
  • 0 t! h2 |" x+ s" v
  • $ h. _( x1 m2 E' r+ K- c0 N

  • ( c4 \2 g! A# a  U

  • , R+ g; h3 w8 l5 `+ _% E2 |

  • ( K9 s4 p) y, i( k& N
  • , _) ~- o3 G) ?2 b- o; {& W

  • * N7 i3 ]" c) S& @! W: ^" `
  • - c. U0 X! j8 ~3 q! }2 J3 P

  • $ ]5 B4 T/ T# ~1 A, {
  • ) {# E: I6 N/ B$ m
  • - Q6 e$ R% j% w# D

  • + v" g. ~$ o6 E/ U% W$ g

  • * j2 f2 ^! n3 [5 \* H; r; K( \* F1 P

  • 9 A) [( G, s* r$ @" c) K! e
  •   X8 N5 w% {+ @1 n

  • 9 x+ E* d# O& r8 @8 _3 f

  • ' F5 B: T7 A' K0 |  l: x$ R5 A& l4 c

  • * |2 _/ T" Q+ Z( d; Z& k% G/ Q. ~2 `
  • " `4 ?  |2 o% H/ z( |* V) G( u$ ^4 @
  • : L+ r1 K8 j' Z2 D( C

  • ; M) V6 w" o  ]2 s" U7 c

  • 5 H! d' U4 H: _/ L1 ?

  • . J. z2 v+ _, {" ~- g0 g4 F5 R

  • " W7 P4 o) t5 u9 `) A6 k% f
  • : d: I; d7 C. E* s2 j9 P, Y" J6 n
  • ! l! a% C7 e, ?; t* I2 e6 X
  • " w; g  P" v& M0 ~
  • ( @) U' Z1 Q8 I

  • " E0 l9 P+ U5 O% n& G2 L5 o

  • 6 p: U" N) r' l$ p
  • 5 y7 M% B. D" L- I2 x. P) L$ G
  • - e" [4 Z* Z% S& h! q
  • 3 {* B, e1 V( E3 E$ t
  • ; `- T( H: z9 s2 P$ Q( O  F
  • 7 W( w; |+ p" b: d& }2 t
  • * A8 m4 S- e) ?7 n9 T

  • " ]* y% Q+ ?, t" R) Y- A7 E' z4 }
  • 0 k1 ~5 h  O+ D. k

  • 8 A- B! i8 C$ c1 R* c" Z$ M
  • " q& `9 F( P) P4 z' u) C

  • 8 @6 H, K8 d$ z/ g2 c

  • . j7 d0 g; ~' a% Y4 u$ S& h

  • 2 v' H! b3 X! U
  • 4 J7 @, D! d0 l' t

  • 4 s9 T0 c" Y3 [+ K- I. [
  • % O# G$ V% W3 w' C6 _/ O+ J1 K
  • ' B. B" e  U  Q# c. \3 z5 Z, [$ @
  • " P2 L) ?4 W. q$ |4 p5 H

    ! @) d- n) a7 U3 c* P: g1 \; T2 R

##绘制有海岸线的中国地图#引库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()
- c+ i4 s& V; d2 i4 F$ P

. Z0 A) s; x- K

" n2 E" m* P3 c' V- N

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

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

28af454b4567839d9c888c0e3809708f.png


# H3 `* \# H* l* D" P# s6 E
  • : l+ R2 u6 j$ Q1 X8 o

  •   _7 @5 c; t% k2 \3 _, b

  • 9 ~1 x" O1 Y) Q4 e+ ?
  • 8 F0 Z$ D  |8 K, }

  • * c3 c* i* c, u" H5 Y

  • 8 m+ ?1 t+ i# L% R, e; u- H

  • 3 q8 M1 j; K9 d' r% J

  • ( `8 m  k2 i2 b/ i) J% X8 w
  • / H8 G* q' N$ M
  • # R  h2 [) o0 |# j5 B+ z

  • 8 i/ H+ F4 u1 G! h9 r
  • 5 K) W1 t7 C, ~# \
  • * c/ q$ {! a- A
  • 7 M6 H$ ]' E: o( w/ |: ?' Q
  • 0 F& B& r# j+ w' l% k5 D
  • , C, Z) O8 M& E! R$ E
  •   f+ ~, C/ y) Q8 f! R. E

  • ! O1 h1 U# [0 V& T( X7 O

  • 9 }7 c2 p# s1 d5 Q& ~- P' ]( m
  • / ?# O0 c2 }2 W2 D! O
  • % ^, R* c6 O4 }4 w# p( m

  • 4 \8 |& i$ ~  g/ }  w7 k

  • 9 D; w' e; k  P9 c( @0 _( C

  • ; N. ^! H2 D/ A' g3 t6 F

  • 8 L; |7 s4 H" v6 {0 l

  • ! B2 ^% t7 q; U5 |1 Z4 X

  • ' P4 f8 v7 ]: ]! x0 Q% q! q
  • ! ]! w5 F$ N: D* f
  • ) L' G6 d! I+ I6 @6 _/ G
  • # [$ S/ S1 q' m( \9 k. q

  • ( \5 C. E5 E1 s

  • 7 }; C5 W' s" b: I

  • " g+ @$ U; \) L; s5 p% ~

  • ) B" U! f. @: \

  • 3 x# b( D* `3 I( e; j
  • 8 ]* D5 h& E6 ^" [& Y" z
  • ; ~% F9 k' N% {7 R) X
  • & ?/ v/ @2 V. J+ k4 W+ P- Q

  • + h/ ^# z4 \5 x8 w- m

  • 2 m7 S9 J2 `. O( P1 `9 R
  • & B6 z2 G+ c. r( E2 y0 l# B' Z& L7 l

    ! T5 M, ^3 W- w7 `9 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))3 j* c3 a  u" n4 p" |  ^, g& [


, {! I7 O/ U& P6 v


+ @% _3 U* _# l3 |6 D                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


  q9 l- k# Q: a) B/ D7 v0 {2 L
  • 4 N* U; h# j! L% E, g6 q2 m% t
  • 0 m/ R) V- q7 F  O( i
  • - C% |& a  _- @* g% H$ A

  • 1 z* v: ^5 m; i, i! L7 H0 n# Z
  • 4 Z$ w+ ]1 k" p$ R: {% D. U

  •   S$ z8 w# |  C; a8 T# H

  • 6 V/ a' }0 l6 s, I

  • . j. g/ ^' m$ o7 m
  • 1 h$ |0 C1 B3 L$ Q
  • : D5 U+ X! J# R  j/ u
  • 9 |0 n* E8 T9 D6 @9 f, _: T

  • + S# w0 @& ~- {

  •   Q8 a. F1 n( L* D) ~! }
  • & G/ E+ Q" D$ b# G
  • 5 a: U0 [0 ]1 G, _6 _  p$ z( H

  • # b1 i3 Z4 ~1 O# y
  • ! V4 Z9 ~9 C. Y& l
  • 9 D' x' S9 o- l* N0 K
  • 6 r7 @# F% r; U! K% B
  • $ |! a' Z8 \  ?/ k. j

  • ! u4 j* K" W2 h  y

  • ' u1 |( S% s9 Z7 m
  • / H- U6 D, @1 c3 d0 ?% w% n
  • 1 ~9 y) ~7 D' W# z) y0 d, Y) f; z

  • & o) d" P5 _* t
  • ; p" K7 d9 J$ ~
  • 5 {  z& V1 N: v) l

  • 4 I% B0 A" X5 b# G; r; Z8 S- F: U

  • ' O: o+ w2 i/ [4 Q( S
  • . b2 c- a$ ^4 A# l

  • + Z( N, i0 c$ ^0 B! q0 `" K
  • , [+ L4 ], w6 M9 I9 a

  • $ b$ c7 u' r' U; p/ E1 u6 v7 K

  •   ?" A  {% ~1 y7 ~" I0 _; q
  • 2 ^! p1 ?; Z9 W

  • 8 u/ d& P! ^9 C8 o% [4 ~2 {

  • 4 P6 Z) V4 }4 e+ O
  •   X: h0 c0 o" h( r! Q

  • 9 w4 o7 v+ U9 o) W* t( ?3 G  R3 j( C" c5 c1 E8 \

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 F) V$ Y- v$ x8 P. w" j


( N8 e3 k5 b" [( ^' Y! K9 T3 L+ u' k, x5 G1 g4 ?* ?8 B

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

1 E9 }- G8 p8 \6 }( H) R

$ Y- L7 D5 U* P& s
回复

举报 使用道具

相关帖子

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