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

    & p+ h: H7 Z  K  D: k/ F

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


5 p; G/ n9 I  f  A0 B& F                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • 1 X. N4 s9 o9 x6 x
  • / T, P) u8 k- M" b0 r

  • " V7 N! b8 F0 Y) S" l$ v7 I2 s

  • 2 L1 v' g. s, q

  •   Z* D* ?8 T" d& Y" E" c: o% F

  • 7 L3 ?0 q# H& m+ S# E1 m

  • * _% x, t  k  n

  • ' M% A8 k* Z5 M; I# Z

  • . l! ^7 t) k+ d8 V
  • 7 _  R2 O6 x) H: s
  •   U! Q$ B+ e' [7 M

  • 0 W* {; a5 p8 D+ M; [' J
  • + q9 |2 ~7 k+ E/ K

  • " W+ A- V5 W" z$ R5 C  f
  • 9 h; B5 c* A8 G* [" v. Y

  • . I' F5 m( h; a6 B5 @  @0 X9 c

  • ' |7 {) r# j* w! i! `3 k

  •   D0 E' T% W' J# ?0 c7 c

  • : x* n3 \4 R. h" W6 H% Z$ q

  • " B+ Q2 Q: E( T, O* A
  • 2 J  P( P( w7 {8 Z6 r

  • + Z8 k! Q7 j2 [" u- s& L

  • 3 C+ @) W! J4 E1 T8 K( X* b

  • 9 Y/ b! V* d. K7 U7 y4 J5 {% ]
  • + K+ h8 C" ?: y, S, Z# m
    " i( P/ A- P% n

#绘制中国区域基本地图轮廓,包含省界#引库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")$ I( G5 b; ?: b" |' i: |, m


3 u- B% S% B! }# X# p# b8 D( b, k+ b, d/ t
  u2 M$ G( V/ e, k8 }

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

$ l3 k7 G( q# Y0 o" r: k

  • 2 Z6 d! v- M5 ]$ n  n4 _

  • & V# `  p0 _  p3 u  X& v: k1 t- j
  • 0 C0 ]& X# E; [+ ]+ J/ s: ]; C

  • ' k$ I$ Q0 N6 a* {) u6 @
  • 2 ~$ t5 ]0 i  x: W  ?  L- E& r
  • " ]( ^) z9 }8 ~: S7 w7 N* F/ C

  • + L/ I- l6 j1 c4 d

  • 0 |. \, P( c( L- |
  • " p7 t+ \4 t- g, E" N$ [) l: M5 Y$ Z

  • 9 _! w( ?( s/ _1 C7 Z, p
  • ) F# }+ \/ G0 V4 V5 a
  • / |5 @# I6 N7 m. y$ W
  • % h% B( Y& D" u) U' y

  • 5 |! L, J* C, Y- i) @, ~' f
  • $ x3 k) ~! r, J1 p% S9 G4 c
  • . C. ~) ?3 z; X: [

  • , V& {& k3 @" a0 q2 M
  • 7 B6 d# w4 V2 @! o

    " v% b+ s  X! C5 e* a, y  n

#绘制中国地图,并标记各省会城市名#引库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 @/ y2 S9 Y0 j# a6 [


0 q: x. T& _, q/ ]4 x+ e% ^+ Q$ s' o( b1 l; G' M' @* g* S2 |/ L

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

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

f5c3384582002193c2c6c354a3d26729.png

( [, n  o3 ~4 g" R) ~6 G
  • 3 _. O3 S% P$ L; J
  • 8 S! A* B  ?3 q- h

  • / b! a0 \  b/ \( R# W2 p3 }, A
  • 1 k( X) U9 B: }* l* T; X. W2 i

  • 4 \! z% [/ O/ ?7 r2 Z

  • 9 |; C. I: N* e/ L! b

  • ; k( D: X$ i' Q  }+ J1 @& g) [& @# H  ^- _
  • & E9 J$ P" B6 `( a2 i& N

  •   [3 d- v2 R& Y/ e# x; i# G

  • 1 B/ [% j5 \& Z* {) O

  • ; Y, J% N% x3 W/ D; D. ?4 Q
  • & ]. r1 E( `! k
  • + ^" k- x* `4 S, G
  • * c2 o/ U' u8 y8 a: Y$ {7 u

  • $ k6 h. B  e7 ^9 M9 v1 k- U. S0 w2 e
  • 8 a. a; j  u1 c$ }7 A
  • 2 g" G  Q$ G7 Q9 q1 A

  • 3 d7 |6 J# @1 x  N
  • : Y+ y3 y9 p( v6 @- w- E' Z
  • ' ]; n8 v8 [' k& D
  • % f5 \  }0 V- S0 w$ J- Z1 O& b

  • 3 R" E9 N. ]; B8 Q+ q& D5 o8 @! _
  • 1 }- p; O4 [$ P% K0 |( L3 T1 f

  • ! I( [  |8 `9 j% A* ]: `
  • 7 s! y5 C% Y% p2 @

  • ( I( D: P. l5 A$ g& ?# e
  • # D* B5 N8 Y% [( U
  • ' Z, _7 X% |! i6 i9 z, ^; ~3 |- G

  • & H( R$ |2 f- |8 x
  • ; P/ e4 ~2 q+ A- K; h6 K* S' d

  • * x) u. R% S* u+ y' v% x
  • ) u9 @1 O" j- j% C3 j
  • 1 d2 t  J! M* ]0 \+ @% ~% F

  • : \, x5 M/ z- y! O: h

  • / {6 ?3 y( ?9 L2 D5 x
  • % t2 x) t; B4 s$ D6 e2 P

  • ' X) `# y  N4 q; G) I" E
  • 9 c8 L2 n7 e. y( f6 n
  • 6 k, r- E* H9 F% j+ Z
  • , Z' X5 s% m/ U1 T- [7 E

  • ; v5 s7 w$ s, }' W* A: ~, n
  • 7 ~  d: D2 s' J
  • + Q* T4 h) \, T" u! p2 \+ W( t

  • % C5 |: [* y1 v. I2 X+ D
  • 6 A+ q3 E' d: A7 N1 v2 S6 P! j
  • 4 N7 b$ i" J0 B, f+ f6 _, S
  • % _7 O/ A3 {' X9 ], T% d7 a
  • ( w7 w% h- k0 x1 ?" k$ A+ Y
  • 8 E& k7 g* H2 s$ ?8 e( j

  • " E0 B* g# Z- h  v. ^; `/ t

  • & s3 }% x) R- [' F
    1 d7 {8 J) f+ H) ]' A6 B

##绘制有海岸线的中国地图#引库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()
# e8 M. [8 r; n9 u6 X$ l" e


7 u0 _5 x) u5 ^. k& Z
6 u9 E1 o/ y. `% o1 ^; @: m- X

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

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

28af454b4567839d9c888c0e3809708f.png

; B+ ]2 p" T0 e
  • ! f* b* A2 r( C% e, [( Y7 Y

  • 3 `# g7 s( U* T3 {. |9 g6 G* r

  • 1 N" r( S( G" J# y

  • ; C( g  o: H* [! s+ |3 f+ _
  • ) ^9 A7 `5 @; X* f( S5 @# e9 Y
  • 6 l# A" V9 v% Y& L8 |+ ^

  • . g' D1 _1 i: W/ _$ l6 }

  • # R0 h! m- M: F6 u, l6 E3 k
  • 1 v5 [4 D) |+ Q

  • 9 I/ T7 f6 Q+ H) F
  • $ F& U4 @) p' ^: {6 C

  • 2 J+ A3 G1 e9 s+ A3 z7 p: w

  • # y$ E, L3 f; z9 q
  •   C+ h: D' V* b& {5 ?

  • " W# S4 C' t$ P" K0 H
  • ; o! u+ U! w6 u8 \0 L- Q  `

  • , n% P! o* a" E: g+ b" J. x$ x. U

  • ! W# c3 y8 l( X% V, Y5 U& D
  • 7 u6 r0 v# s9 a) }
  • , y0 N, d# w+ ~  G2 ~

  • 4 m1 G9 L( t6 X% ^7 e) F
  • # A; k% V+ b0 ?  J, `! d+ h) T
  • - D2 s  c" S. l' z+ Z
  • ( A* u( L2 e8 L, A
  • ! C3 b: q$ E) ~# _
  • . \# i0 U6 \+ d; {! P; M2 g" E0 s
  • - o! F5 M6 |2 I5 z

  • ) E% ^3 y' B9 ]0 Z+ m3 J# P; l
  • + ^+ S9 w6 r0 Z( `% ~

  • # {9 e+ v5 @1 }. N4 U$ ]
  • 4 [8 ^( I6 @( w
  • * [" t# g& @# w7 }7 [

  • 2 k: R7 R( ]# o# x, x" _! @2 H2 x: O

  • ' N( p6 l1 `/ h0 m: O3 j" r

  • - ^( p9 x7 ]: m- C  j: X
  • , j0 s7 ?( J' \( k% w7 m; z
  • ' i' ^* `2 p6 |( z7 T

  • 6 |& Y7 l2 q% _1 J1 E9 v# k9 I
  • ; M9 B& U" I% t. q
  • # b) j% |, v$ S' A
  • , _/ U( \% S: A) h7 t
    ; \% s2 }! R8 \) b' L# U7 t

#例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))  S' y! z  o/ P8 E( M% K7 ~* i

+ ?( |6 z/ q, Z$ g+ c


2 P6 Q9 g" }/ a; m                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


6 O! [+ z/ H- S# E  h5 e* j
  • # d" S; Q3 ~) c& C- G" J5 Q3 |
  • 0 ^/ @( x* G* G- F) L
  • ! ]5 S8 i. C/ x& z9 v- |' f0 H
  • " w% T0 }+ R7 i  i: ?- h5 ?
  • 0 c# ]+ U2 \3 |; C! P

  • 7 o& f# }  [5 s$ e5 w- N5 w

  • 4 ?0 s5 K# f8 [

  • ; v5 [" t8 e' D) c4 i) O  y

  • # P& s' a0 c8 z$ D& U$ g
  • - O$ c$ }: X1 ]3 @8 Y9 }6 Y
  • 4 N$ u2 K3 F) ?: b3 [5 i" J
  • & D( M% R" L0 r, I3 W. \

  • ' a# p; k2 M0 O  l7 r

  • $ R; _. t! B3 }; r
  • 9 c8 t* C) R( v! l6 v  V0 h9 w6 G
  • : y$ Z5 O) M: W% {% d4 |6 D
  • , U4 A0 J: X8 w9 @

  • 4 f4 V  Q4 h- \  O
  • 8 ~8 Q$ ]1 h8 b

  • : ?1 B2 {% r' @' \" o/ `; W0 I

  • . s, v: B- O' X4 H

  • & N8 D( u1 o3 ^& _4 p

  • 2 ?( A% q5 F& D

  • ; T6 `( M) D9 H- @: \* T" i
  • & _+ Z' c4 F$ k, X. J0 V) B0 |1 i& q9 S
  • * I! `1 D+ t+ \

  • " F& |( V5 y% [$ m( |3 M" R& y

  • 2 E2 f8 k! s; F6 F+ V3 Q# M
  • & I5 B, _  S1 l

  • 2 L8 Y4 T6 z1 e

  • 7 m; W. l3 h) l' w( {7 f$ v! C) u

  • * \5 t; t. p  \7 q7 n' H9 D1 y7 T

  • 5 {3 G6 M3 s- t4 Z6 X

  •   X) B  B4 ?! `! `
  • 9 y5 F  P: H7 D+ L/ r
  • * B# S4 C/ {$ L* p3 |

  • 7 y, r  Y6 @3 D; o$ r2 b. O; m

  • 1 t: k7 a' H' @6 R6 [
  • : O7 ~: L( c5 y% ~: |: D* t) F2 H

    0 u4 j! y" O, L" k8 T% z( M4 A) H

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))
6 V7 }: [4 i2 U1 s

, m8 ~# L) D  \6 o' R4 x! m

0 J+ I- y( V+ e% n: C( O, \2 E

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

. `, s/ V8 f9 l1 I, C3 O  G
0 P* C8 B* D# D% p8 v

相关帖子

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