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


    4 s1 b/ Z: N" _% y0 R& [. T9 Y

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

6 w# H  ]: F7 `
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 8 L* W- w8 a* I; n0 Q
  • ) C* ?3 S( Y- \  S  R
  • ; d0 B( O% M8 E" A. h
  • 5 c! [+ ~$ w( `9 ^3 ^3 C
  • ' g6 A  S. }- s" |1 }

  • 5 |% U" J5 u/ s( A' h) q) |
  • 3 H5 |4 w3 I! ~) F

  • * O9 a, Q6 t+ h# R2 @# [
  • 8 `0 ^. ?" p6 _7 I) @

  • 7 I- U# r# y1 F

  • 0 S* A# Y  @0 }  {2 u6 o% K

  • 3 q) D7 b. @& \& W2 Y: j
  • 2 D* h4 k9 o1 `. Y  Q' F

  • 5 q0 q( l' [' f' A! U! B

  • , J; o( D5 B" |6 M/ Q+ _# O  ~2 ]

  • 0 v# [: {3 @( x. i3 Z3 [

  • ; n) C: L8 e& C5 R3 \) P8 L. o5 |& q
  • 3 m. \8 E, R0 w" n" ~" s9 |# o
  • : y( Q7 F% p7 E- ^, w& _; [0 a6 e

  • 2 Q' x8 {) G, B) M2 n! S8 a  m
  • ; m6 r8 @" F* h* @5 x4 ?

  • + H# g( K& D$ J! ~; p1 n1 w& a

  • % o* [* |" k0 L1 m" @# v

  • - M1 o8 F- c. Z" {
  • & y; k# N: n! ~& b0 q5 a
    0 m( I2 J7 m4 o

#绘制中国区域基本地图轮廓,包含省界#引库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")6 e/ ]* V8 L/ |6 c, q: U2 G

3 P3 u5 F: C: M- h2 I" f

/ n& ?2 e, g, z* }- V

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


' E, ^0 T# {/ v0 k9 @
  • 8 H7 K. v8 e0 d! A# f

  • , w. ?! V2 L6 X. \' L8 Z
  • 3 ]2 x5 w4 X9 ]* {
  • 5 I4 }( N' O/ u% t9 A+ \
  • 6 j- s3 r% x' |( U$ b& O
  • 9 z* U( d( o; B6 D* a& {
  • % O. G, U9 E1 a2 O+ j5 k; j
  • & d/ b% u+ K. N4 v2 I
  • ( R; f8 A0 B+ b. }
  • / i; ^% f1 b  Z6 {/ A0 _
  • 1 n* U9 g5 r( A: V* `
  • - {/ k8 n5 s/ }+ g# w, a3 v( H- _
  • " ~! b8 T$ C1 S
  • 8 N# W9 m) I7 O4 |. i/ S
  • 7 b7 C0 G$ l% k4 ~/ `" u

  • 6 Q; D3 ]+ u2 V# H! ]
  • 3 G- O, N$ ?( P% i) M; I
  • 8 n+ ~) n; \6 W) x" A
    3 x: k; T! w5 A$ V% S- [

#绘制中国地图,并标记各省会城市名#引库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")
; o1 W4 z# R6 R  u/ Q


& V) [# o5 ^8 |& T. _1 Q! C! Q# D5 i( r% Q4 |. Y

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

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

f5c3384582002193c2c6c354a3d26729.png


+ i  t- \+ h$ e) H- n% O2 j2 X

  • % H* [, W7 w" l, W

  • 1 o0 k8 z+ Y: p$ y* D
  • ; E0 y1 ~2 M* u. z

  • ) E1 E) R% b. ^& M3 m

  • 8 U4 ^! n( f% S; M- h
  • % o. q1 C' M# t! @4 e1 C
  • 6 q# R3 e, q8 q8 l

  • / W2 B3 M4 @( r2 y9 N
  • 4 e7 E0 W( G$ x; t" n; P# W8 V

  • % [1 y! I' S- T- i) s) F" `  \7 q/ H
  • ) F- K" r2 P" \3 s* M3 _) ^  J
  • 9 D& A6 \/ r/ c; _1 o: s1 X' W0 G) n. m
  • ' |: w- j3 R/ l2 ]: S$ d
  • 8 |& ~1 g/ S+ w8 K' }% ~

  • 0 N! c  d% g* A  F
  • 2 ]6 x: ~% J* M$ w, |* Z5 h# x  {
  • 9 L2 j: N9 o4 b' f5 E6 x

  • 5 ]& Q% {% x8 k

  • 9 c9 N; ^* ]( \+ A: Q: E9 i

  • : X) Z. |; s3 r* A$ f* k- q

  • % y0 \  O! l- g; Z4 h! V

  • + z+ k5 {$ N$ }
  • 5 K& _5 u! \$ x" g# z9 s6 h4 Z

  • ) y+ a; i% f# g8 Z
  • + S$ C0 Y% |& m5 h# v0 b5 O
  • # I: b0 J' O' d! p3 V
  • 8 `; a2 \$ n# R; L  Q7 {" Y2 n

  • 1 I7 Q! ^* Y. T4 _% ^  N

  • " A8 M- U7 b2 M1 C
  • 9 K, H6 d4 E2 C  o
  • 8 f( p/ N( ^; w& [2 c  B- w' P

  • ! d  S* ?6 H1 n' u+ \
  • 7 D, f( V" P2 B( W- `8 c
  • * Y4 T8 v$ h' o$ r, V; u, i
  • / K" q3 \' D* X" ?6 o
  • 0 T4 F" R/ Y& ^' q: J
  • # X+ Q' J8 K! o% V, {4 s

  • ( W% P$ X4 @. u0 q% o, d! c" u

  • 9 ^4 @; j& B0 N6 y' m
  • / [- F0 ]$ h( w& C/ i- @

  • ; \: ]9 B4 S, H/ z  i5 I" ?. g
  • 0 _1 Y) \& o! q1 }8 o' ~, b& O) Z
  • ) O& k- ~0 t' u; r( ?4 Y
  • & W3 d7 `+ N5 r! L- C
  • + t: f* ~( p! }# ~1 m' k
  • 4 `" m+ D' E. L2 @

  • $ z6 V) Y5 _, n; n0 v
  • ' P& |/ B2 ]2 O, W- a! O& |
  • % y; o6 ?$ ^. h6 _( ]8 \6 y' s

  • , E2 v- H: u; r4 B
  • . V( n: ^. ~& Z# I0 U- G

    ; r3 s- ]2 V7 ?2 A5 v+ k1 W

##绘制有海岸线的中国地图#引库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(). N7 t0 D5 I8 g# N3 O

  w$ K0 w. |) _! i! z' I3 W

$ I+ n  Y& _2 b6 u# Y

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

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

28af454b4567839d9c888c0e3809708f.png


- t4 r4 r# y; T1 T6 N

  • " U. w# F- ~) y* E+ v8 m
  • ! U9 I- q+ ^1 n1 o! x: G8 K" r5 t

  • ! e- x: x; l3 J. F  u+ X) J! h

  • & ]" T. D( T4 d( L" e
  • & }9 Q& i/ U+ J

  • 2 R# x/ W: _& g  e3 P% `
  • 0 T8 R8 n. k. z5 I9 O4 ^0 e+ a
  • : p/ u/ \" V8 z6 l  `

  • , y/ s3 {6 y. b. Y8 ~5 \0 x

  • 3 F! D! f$ S- U4 W
  • 8 A; c/ Y9 j3 N; K. z

  • & g3 k4 M* z9 L

  • 5 u1 R0 N; M" h& y: ?
  • 8 O' v  l0 z  |8 U4 v
  • # r2 k4 d+ E" p* A4 S8 Y

  • ( K! v1 q& Q% w/ L2 Q

  • 9 M3 f  \! f! P- ^

  • * n( o0 _) o3 [' A  \, S/ D
  • 6 ^8 H! \, }, o3 K" j) y

  • * u5 s; L2 I+ P' m% j. S9 g

  • ; l+ ?; a% M7 i$ M$ }' a

  • 5 e6 _2 G0 E8 j- R4 W( N: m

  • % U# ?  n6 _' z9 @+ k

  • 2 v8 {3 s1 t' ?7 {' E' a" a8 }; @  {
  • 6 S  G5 P9 N% \# _* v

  • 1 j( i% v1 U1 g& s% x

  • - r) O% ?! _  z3 Z) o
  •   p1 v0 [% ?0 j( ]* P2 q3 R

  • 1 ?# U& a8 y" o5 u
  • / M, h4 M$ |6 O; v  S  F: i8 a0 v* f- T0 z

  • / `' Z/ ^1 S0 u; ^

  • & L( h& T4 i6 c0 t9 u( O
  • - @) E; M- ]4 |0 ~
  • 8 G# x2 L2 t; M3 }) C5 c

  • 6 M, _4 u2 l- f$ F
  • . x! N  Y+ _0 }) B7 D9 O
  • 8 I' }2 @0 i) F, E" @; W: h. Y3 Y3 F

  • 4 i. ^* i1 u: N5 K. E
  • - Q4 H9 q  Y3 W; g8 ~) M7 I

  •   R% f0 S2 n( W* b: t" p

  • 2 X  g* N2 {! o! R: M- P- r  m7 K1 N0 w0 T7 \& U( m1 n* s8 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))
; ?1 e8 k  [9 n( h4 P6 A9 k


7 h. v+ d! r$ I+ z

; J. `; N( I6 ~% e
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

$ ]+ z% ~. Q/ S) ~0 T7 G' c# l

  • * a7 E5 v/ {; U" {

  • % y& D! Q& ^2 q$ `2 P/ {

  • ( b6 e8 @8 ?1 z$ Z- |; y: A$ B7 F

  • $ ^- d" \4 i9 K" U! w

  • . c: S2 O" h8 K5 j
  • $ M, V% v, m5 {

  • 1 V* z- _/ F7 u. @+ ~% l

  • ' D6 @: P; H& L8 z/ o% y# T! D
  • ) I9 v+ a, k7 {+ m' I0 A6 F

  • 3 I! q" ?/ [; d, K7 q
  • . H5 S: J5 x" [$ q
  • 9 R! B! k3 y+ T" i, _1 o% K
  • 7 |1 b/ r& d2 R! e# N4 I

  • - _3 t( b- \5 [

  • ! l* Z: t' E( i
  • 4 y; d5 j8 S9 F( f1 p% \
  • 0 R! S0 d- d9 d' {

  • 1 s. A4 E+ L, p7 O
  • 4 [0 a5 t2 t$ W4 m

  • * v9 L: l7 [5 t, m/ I& u" x7 a9 F

  • 9 g# [+ e8 h1 h# b  c. k! G

  • , @5 o- Q+ U: x  s) f$ x

  • 7 m7 t% n( L2 Z- _: b
  • ; d6 Z  S4 J7 B% X9 _  a. v

  • 4 @; K* P! j+ n

  • 6 `1 V4 W& S  H, F) Y$ k
  • & ~+ A! Q' `- S; ]2 ~

  • * G# m8 z4 I' e8 b9 K' d% o$ s

  • 6 }; H- Z' U$ n$ a! m" [0 h* \7 h/ m

  • 9 v, N" P) @- ~* N
  • % F# S0 ~. p4 X

  • * J  U3 O5 C0 f# g* y
  • 9 G; R: @8 _/ _" v9 }  }4 R$ O
  • ( K" T& E$ M; a! F3 j( p4 r  B6 N

  • 0 l- {* r  y+ X& N  O  P

  • 6 o3 b" _% t6 x% _

  • : Z: W+ I( g5 L# R# x2 W) e; m1 z7 \
  • , l9 k' d. O$ O% n5 f* i! E
  • & z; ?/ E* J( w# p1 w1 O7 J
    ) j) K; }" ~- ]6 R

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))
0 S2 \# w) y. l+ l

2 C4 P7 S" {9 h5 i

* \* n1 i8 R% e* S) C

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


+ e. K2 a' [* I9 W4 h2 M7 G$ `& `/ }2 C! L0 j1 V* `. x4 F% s
回复

举报 使用道具

相关帖子

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