收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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("···")

    1 ^/ p; ]2 L! q! p

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

+ u+ G. J/ p9 o' m* E' {2 Y; b
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • / z  H6 I! C" S7 ^$ S8 B% Y- {

  • 7 q/ Q: g/ ^  ]$ u

  • + c' {$ h- L6 i7 K" X

  • 6 {! g& V. I1 Q/ G
  • , X/ R  p( ]1 ~/ {8 Q& [' y
  • ) X8 ?7 t. f3 j/ m- q3 g! B* _2 B

  • 9 L5 v' w$ {1 P/ M

  • $ q1 \& X+ s  _, F! X  h9 Q
  • ( ~' }. Y$ o6 l* N0 M/ U

  • ) \% Q  E: m# y4 i
  • ) k" K* P) W5 E4 @6 J

  • # x" g1 C  S1 P, Q7 S7 e! Y! d
  • 2 @& M- g7 L# p6 J# g* i

  • ! U% N! J2 c( C
  • * j4 T3 z+ b- a! x) Y) V( R  z6 _2 I
  • : ?  p# ]" R8 O

  • 5 b4 k& U3 g' ?  M: [

  • ! c" i$ I7 i  Y5 P9 K! S

  • , c6 b% x+ M0 ?  H
  • + A) Z  E( O# Y8 c; R

  • ( c/ N$ s' c7 ]; u/ A
  • 0 |: Q+ H7 E3 @; z) Z( v
  • 4 l! n, r: I9 U" d8 i0 T1 r

  • % P0 x- ^- r1 {& J5 A
  • : J2 Z$ `6 K( F8 T" w/ u3 t1 q3 D
    6 B/ ]: U# T0 _: x6 M5 U$ E

#绘制中国区域基本地图轮廓,包含省界#引库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")
  E1 @1 {5 W4 A/ ?+ ]1 R& \: D


4 X: Y) @& K8 p; H% F; R8 v
' w% h" W: Y; w- |8 Y

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


( v, M3 s% j, P' }) `( Q: W( C

  • & J+ ^$ t1 I! |9 O2 r$ w9 t, D
  • 2 s* _/ Q" k& d. a: p, e# D
  • ' B; ?0 L& r1 b% G

  • % I9 c8 _: V/ e3 N& D- _5 y; R5 j# w
  • 1 ?) |3 o/ A  R7 e# ]

  • - j' c# O! l0 z9 l8 n# h7 v
  • 8 t# W* z7 B& \% R% Y1 l0 X
  • $ M0 N* t+ G+ z8 ^: ]& `1 ~$ Y5 ^

  • ! c; u7 O2 f4 K" s8 X

  • 6 i) ]* D8 S3 o  d" Y9 f
  • 5 ]2 B+ l4 L4 ^0 [; G' X8 r
  • % k! O7 E# S$ S; u1 j" u

  • % N( M8 y% G/ W" A/ E8 b. U

  • $ [; M& Z$ p2 d! @+ V

  • - G& |$ y3 L6 K. D

  • 4 D5 N) |) T5 c7 t5 W. O
  • % M- ?# b% n8 t4 ?' E

  • / p6 U  W/ R* z$ c1 g6 C! H
    2 |( I7 a2 v" {/ x

#绘制中国地图,并标记各省会城市名#引库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")
, D$ I3 c) n$ l% u


& ?8 m1 P1 j8 p8 N* W' I. ]$ j( A) d1 K3 j3 y! C

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

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

f5c3384582002193c2c6c354a3d26729.png


5 F2 J( o' }) _/ v# T2 R+ g, a
  • 2 h. C, z# W' P& S3 P9 s  N

  • 3 B( I: M) u0 Q  D

  • 1 g: w6 e6 U2 Q8 Y+ j
  • 2 g' B7 T, p' K

  • / }3 }. `; y& r+ q; p
  • " f. M" G0 z9 N8 R+ M, b( d
  • 8 @  j' j) f! F

  • 3 p! ]5 M! g3 q( d
  • " H$ W& [, }- _) B: Z8 C! C. P
  • . q0 Z8 t5 P+ d+ ~" p  |7 }
  • 7 I5 c" K0 i2 R

  • # s# ^4 w% b# j& c' x1 f

  • ) J# k3 t7 D, Z5 O

  • 8 V$ b% I$ D8 {
  • * B& X: V$ v/ d& G" }4 ^% ?

  • 3 S- ?* A. I' z8 ]& k8 p/ {
  • ' q2 Y7 b5 n6 F) L) D* `& i

  • $ I5 Z% T* b+ P$ }8 h. T4 n: w

  • 6 C  V$ q( x1 _7 q
  • , u# ?7 \: d. m% q- q0 |" I# W3 j

  • 1 N9 S/ ^7 o$ M
  • 8 O% U% l. u. _8 x, p: ^" c7 T

  • + h: k# F' R5 }9 Z- k
  • 8 L' T3 k( `; T0 Y2 l$ M, Y0 H
  • 7 |1 r( e/ J) ^

  • 0 }) O! e4 L) L2 z- n

  • % e- A. X, A4 q% g5 u
  • " ^! Y+ d' U0 a) k7 ]5 i3 `

  • ) b: v/ l' q4 d- ]0 C3 }& b; y. r

  • , ^' M8 B' s( |. C8 y

  • ) C# n. ^" f' f
  • & }+ I4 l& E9 ]$ q5 w1 `3 s% O
  • 1 S' H# }7 _0 v, d

  • 5 r0 m0 T2 j2 w" ^: S, H
  • * h& m) P- |. u! G) g5 d

  • 6 v$ b! @/ x1 d/ U8 n! i

  • # F, z6 C0 O7 h; J7 b9 Z; h
  • 6 {7 D; D/ F2 M/ S7 Y8 }! _. P- c
  • 9 D4 e0 Y1 Y" M3 \) d' {" q
  • # T$ }& }+ t6 p6 o
  • 6 q$ P: z; E) q  ]1 P4 U8 b# B

  • , z+ ?! l- X5 `

  • ; ^+ K7 Q1 R7 ?7 U" d
  • & E% G1 f8 T1 k& i* U8 \. W
  • & [$ h. h; S1 e. W$ Q+ P& x
  • / @5 v  W0 S# F4 |* D! ?/ }
  • ; J# d& I2 a* g% L

  • . p1 L+ a! H6 m5 P& b4 O
  • ' l, O( R3 y/ B/ ~9 n9 b8 s0 z6 }

  • ( c# w/ c' C$ P9 T

  • 7 e; P, q+ w8 Q& Z3 y
    ' N+ `' D& o+ H* W7 O& r$ 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()% ^- }% B9 o: Z  l! p, P


% M$ A) O* c5 R! M1 k+ l. y/ i" t7 b5 I3 b4 Q- w

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

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

28af454b4567839d9c888c0e3809708f.png


7 \; w% p) H7 c% [

  • 0 g0 s) K' e/ {. K% u! P
  • 9 k* R. B+ W6 p

  • ) @4 D# E! W$ k) }5 P
  • 8 c  G. J5 T, }! d9 L3 f

  • % ~# A5 p- y( R2 y: x& L; R$ E

  • 8 Q) ]4 l5 \9 w. w% F

  • 6 |( q( o! ]8 |9 f, p

  • 5 V  }9 N6 G" m: d+ o' f

  • . n" K0 r# p* |
  • 6 C' z6 O; p- V4 P

  • 5 w) z4 J" Q' l4 Z3 ?

  • $ }2 K2 F! }) Y7 O

  • 5 q- i" t* _; u
  • * P( ?6 }0 [# p4 b' V& ~  @+ V8 \
  • 1 y6 w; x. Y* g2 F6 C& B1 ]

  • 6 l$ c: x7 ]  w' P* w8 G7 F
  •   D# e- n9 _5 p& r" D# s/ p

  • 4 C/ ~: z* f6 X4 M+ @' L, }7 G

  • " I5 |9 @) Y* m5 B* o8 E1 P
  • . r$ J9 J1 N0 v  [( s9 p; z
  • & n: \4 @6 y  p! `) b5 H# q
  • - {, V0 c1 Q) F
  • 8 ?) Y9 s  _+ e! X8 |8 Q

  • : p+ s4 E" [; b) c/ i1 d  {

  • ; p6 n1 z8 }  N1 t8 B

  • ) h$ i# j7 B; v. ]8 J
  • 1 N7 \2 h. C1 r. X
  • + `5 e0 ^& {( [8 u) T; O

  • 4 F7 q' {0 g1 y- {4 B8 J( W

  • 1 n0 Q, A$ D8 x: l

  • % ^/ A7 ~" F( J; h  [

  • 4 D2 a" c4 b( ^6 x

  • , T( n* q5 t" F' n  j0 M/ S

  • 2 w5 K7 O% |( e1 G$ d

  • : `3 H6 o* J; Y. `0 c$ T

  • 1 b3 ?4 l) ~+ n& c
  • 1 X. x7 M) r5 [$ ^
  • + p' b& t$ g' v) S9 @
  • / h& N6 v9 T. W' |/ s0 J
  • 9 d. ^* F) X  f

  • 0 o% k3 D3 |* b8 ^/ [: R/ O8 x) _
    ' J2 R/ `6 b% I6 O: n% P

#例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))
6 g+ r0 l6 ?; a3 v

$ c  n# H8 ^- p- E; {7 e

/ ]2 }# k1 n5 y* C0 r, {% [- A. x
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


! o$ |% p  m" z* A* v0 S) z
  • 1 V+ G7 o! G1 F- p! R

  • - b, X& `+ I0 U) i& n3 j
  • ; W9 }7 y" F& [
  • , m- D5 _" w# P( p$ l) O
  • : |6 v2 C  b& a( h& }
  •   K$ {! W' ~% x. ]# o9 O

  • 3 {$ b1 j& K+ u3 R' y

  • : a' i9 J- |( B7 T( t) D
  • 7 _3 B- N5 ~5 c9 |1 W9 T8 S; M
  • 8 `7 y8 \' r! C, d! [9 j3 s% V
  • 7 }9 U5 K  f) Y& m( O. J, l- T) K2 {! R
  • / x% b2 F- m: P9 ~6 S

  • 2 ?% G- E5 n  [

  • $ z1 r* O( g1 b% k+ l# ?" X- x
  • * Z2 ]; z1 \9 k  Q- E0 L% J8 H
  • , d) b! T0 u! d  O2 C9 I8 W: r

  • 7 S3 e- B# k( z: \& y) d! F4 {. M

  • ! I- F' T# d% Y9 ^0 K: C6 d

  • 1 t0 |5 _/ C( G( q6 e
  • 2 Z4 P3 O- X# ~6 D$ y0 `

  • 7 k+ P* m* ]* L7 P$ v' v1 c

  • 9 ]* V/ n  T/ _* p9 }1 T2 K
  • * j0 L/ G& v$ T/ G2 y
  • 6 {8 R: H" |5 K, q# J

  • 8 a; j* a3 A9 d# F

  • # S4 I3 \% {* c" P/ c8 l

  • 1 J& u# `0 T; y( B, h2 }5 M5 l! e

  • 8 U/ S; T* ^2 d' s' K7 s7 N. Z

  • " t+ [$ s" D2 J8 `) z* S8 ^. Z
  • 4 Z$ x. Q% N0 N9 `. C  s6 y- g
  • 7 `' x- p' k2 H1 Y' L/ f0 F- v# Y
  • $ ?! e& o; A- [2 B5 `

  • : |& T% P. Y; b
  • " z5 G7 R: ]: W6 @

  • & i# B/ r& ^7 K5 ^( ~
  • % G/ x% c1 Y' r7 D; n0 O4 _
  • 4 Z- G9 o9 S1 w( Z. W! {

  • 3 [' U0 |% z, M/ F

  • 6 h! O# a% B3 ?# b% G- m) b3 ^3 l0 b1 c

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))* P& r- e$ i- R8 }

; k' R: A( G; X% O! v

* O+ h. ]3 n9 C# v6 {

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

) i: `- C  J! h$ p$ N3 t9 s
# `  B+ f* K4 q; D6 _
回复

举报 使用道具

相关帖子

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