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


    8 T3 ?. C5 [8 ^8 |

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


# Y% F0 j3 Q  N5 ^3 j                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  •   @9 x' ]& n: C+ G! A9 F6 f' h( Y

  • # Z% N  b4 h3 Z, n4 C- Z+ f
  • & u: }1 N% K# D# R$ f4 @
  • $ X8 T, o3 m" h/ x3 [1 t3 T* J  J

  • 0 Q3 r3 W% w& |6 D0 C4 f
  • % D( p% j+ m' \# O2 q

  • , g. E" _* N4 r" U8 l3 w8 d
  • 2 D5 B  I1 j" M9 ]) s% }
  • 0 ^2 j  @6 m% q0 R

  • + E. O  L* z, C7 L% z, M9 W
  • 1 M; E9 F1 l: {+ ]7 |& I; h
  • / ]: i4 [$ J. P- I# W

  • 6 P7 @1 Y; n) Y9 Y

  • $ g/ s; |) I& V  ^1 j7 O

  • : [. z5 s4 ~2 J6 J
  • 9 @" p4 o) C, x2 \9 l( r# d4 P

  • ; \' Q7 {( N! ^4 j' A% k( d7 i
  • 6 O+ J* S# t) C' K: M
  • 9 A) K% Q% G7 ~& |, o2 S

  • ' O$ n1 n5 A2 _6 n/ i
  • 6 l* ~9 i1 S; @

  • , v) u2 ]2 |9 e1 `- k' a8 H

  • ' n4 O2 q' q- K) x8 \9 S) h

  • - ?; h$ M: ~$ a- j# m, o

  • & D4 m: f% R: t3 W
    1 o6 }3 @* G& q* c

#绘制中国区域基本地图轮廓,包含省界#引库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")8 b/ Y# e5 p" x! l

9 y8 p( |" D( z# P8 l$ O
# T3 A7 i6 ~- m6 H# Y/ ^& F

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

' C& y, I7 s! ]* |. }& f
  • 1 K  j0 }: i6 w7 I

  • & ?8 y) v/ y4 h% p7 _5 N
  • 2 n6 x" e: f9 R
  • 7 R, P6 Q2 u2 V% Z0 p9 S5 O. \

  • 7 b+ e2 I  x) p) y1 E
  • 6 Z7 I, E4 N. |9 E1 U9 R! D

  • ) T% \) t7 Y3 f9 U9 [# c
  • 5 H6 w( F6 b/ K. q" E! g1 ]( L
  • ; ~1 t6 F7 V) H" g0 f6 d

  • . ~7 [5 z% q; l4 W

  • & w( g$ v) A. `2 P: E

  • 5 ~  a6 U  S' w3 P5 Q
  • 5 J& P% L; I) b" b

  • : O: o; E+ Y* H1 L. k

  • % u  w0 [) `) B/ Q8 F

  • * i* U" |* A) u$ X. ~9 w
  • ! V) _& Y1 \# z+ n" g

  • 8 y  i8 ]8 Y' b& M3 T+ O
    ) ^  |: @& i7 }

#绘制中国地图,并标记各省会城市名#引库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 I0 r% F' }4 {  Z, T

' W# c: U: W2 O" ?5 ^+ H2 F+ e

: {' o: J! d1 {7 [+ F5 d2 D

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

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

f5c3384582002193c2c6c354a3d26729.png


. c0 k* y4 I" Z+ N
  • 8 X3 x. V3 T+ u+ {2 t) Y& U
  • # I& M$ a# B" k3 t' b3 p

  • " H6 @3 O# R, J5 ~
  • 5 M7 \, p0 m$ E3 o
  • 3 Z( `" G1 ^' ?( i# j2 F6 U2 ?

  • - ^8 q2 w& G  n9 V3 H
  • 0 T# R5 E; B* z( E

  • " ]1 k) }* L0 `: C
  • ( u8 }0 D. S! L2 [) h2 n& H9 s

  • * c) w3 r2 ]. I$ [
  •   N! X% D9 _1 H2 n

  • 8 e# e5 j; }1 I: H- E) ~0 C& y

  • # C8 j$ t" H7 K: I. |% a
  • $ m' V' f' |( W8 d8 \1 f' W" J& T

  • 3 s+ k- |, O! L- p! H
  • 7 V$ p$ M/ h. c. d

  • " q4 k# H% s7 s$ K/ Z! C

  • ) _9 `6 R" A# Q# E/ j# o. }* h

  • 3 C7 Y% U6 |! |7 b
  • 2 b0 E+ Y  I" q/ U  `$ G
  • 9 t; T& f$ [- W2 h( n% J) g

  • 2 h% @; s0 G/ t" v3 o  j
  • + x) H! E! Q6 U" i

  • 2 |8 z0 s9 V, Z  {6 k! C
  • $ z* D+ J) w- h4 U# h3 w
  • * c. A0 b' j& o2 ], P+ R/ {) t

  • # }# Q0 E; l9 R' e6 v; ?  }
  • / L1 L" a7 U) O

  • + @" G8 }: ^) Z  n

  • ! C" `' ~! L5 m( s
  • . J0 A" i9 G9 g9 N; `

  • 5 N! d+ w. Y0 T0 A5 [- X1 d  H
  • 1 [  V: H8 b' M5 X! \$ T9 G

  • $ a4 X" ~* {& D, A9 G

  • 7 V- L' O9 N" E9 ^% g

  • ( g3 m" b! |' n2 m# C) o% x

  • ; S  k" h* [: c* f) }

  • & n6 Q7 F7 B  u& T& D/ c# K

  •   M3 Y/ q3 F6 }6 H& z" y' b: o
  • ! h8 x) {( G- ?/ J- W; t" U; _* u
  • 7 i8 g* V3 S( H8 v  O- F

  • 0 w9 D& P4 c  R+ c( J2 b6 q

  • / f! E! q5 \3 {/ n: h. k, C

  • ! ^7 L' S2 u$ l5 U* m; }9 I
  • ' M% ?+ W1 P% R: F4 f2 K) ?4 b: b
  • : H! O& I0 a$ l! }

  • : S/ I2 e9 Z) `! O

  • 2 z$ H; M7 z, y+ A1 c
  • 2 e0 _" _) s6 Y$ B" O2 X4 Y
  • 4 v* M1 ?; \, X: z7 ~. y
  • , A' z, X' i3 j6 Y) E4 U3 A- ~
    + D! P( M+ h7 t! n

##绘制有海岸线的中国地图#引库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()+ {/ P. E3 k) D9 O, Q4 X


1 A: h" \' e% [' s1 W' j2 X
* M% L& f9 Z7 v  j" r8 w

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

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

28af454b4567839d9c888c0e3809708f.png


* i7 o. I4 h9 ^3 V" F7 d5 y

  • 4 k, m1 Y) Z) X8 ~- a
  • - V) O$ o9 P6 ?: u7 X; A. ]

  • 6 t, ~5 j1 x+ @" B6 o# |
  • / I/ m/ C& Q- h% a  f

  • , t  ]+ k# J# x9 ~

  • ( f: P5 [3 z2 T3 h' _. J6 b
  • 4 A8 @8 H3 R3 F

  •   A4 I4 G; B. V8 u& n% h

  • , X  y0 c& i$ j/ U2 F" r

  • ! ], P5 Q- G- L3 [! d+ l- r+ C5 O

  • ) x3 x, J& E, B3 S& _
  • . X# Q* F( s: [

  • 4 g, w6 {- F4 f" h: K! |
  • 2 I& o' n" J- n' o3 T

  •   `0 j" [$ K- [( G" ~1 g
  • ) t( S( s" ?. N2 V9 Z
  • - _. @- l- J3 Q/ I+ h9 v) Q

  • ) Z6 k7 c& Q7 G0 B% k3 P
  • 8 D8 [* Q4 I% U) f" T6 t$ V6 @
  • ' H( {: [9 v6 K3 N3 z- j

  • ( W. a: t# k4 q

  • 7 e8 L+ i, r6 g" C
  • 6 n. l) i* ]! n7 @- G
  • " G. Y& a4 U( V% F5 p" U7 Z% S
  • & i3 B" Z: o4 X* |, ?: f
  • * J6 Z1 n) _) |0 R' `  x# Y& `# r9 d
  • 4 J! ~/ }& Y6 r. V
  • 6 K  `: U7 R: F3 g3 v1 V
  • % M0 O+ s* c( c8 h
  •   ^. D2 E1 p9 U8 F' ]

  • 3 B. n  f* i6 Y2 M" d2 T+ p' {
  • 6 Q. |* Z, z8 Y
  • ( O9 |) u" h  l" R3 b' H
  • # T, @# b9 X# j' y. ?
  • & Z7 R& M4 Y$ Y( X
  • 4 ~7 f  M( C" \& V
  • $ M- [2 x$ w/ [( F
  •   x7 d( p6 S+ H, g

  • ' ~! I. }, u. z

  • ( L, Y% Y; d0 P' t, p& u8 D0 E& y. F

  • 6 r$ [. [* O, ?3 F" k3 W5 k1 Q# y. t7 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))
8 z. c+ a$ F5 Z! l: H


+ W; T# W$ z' s- e6 O7 t$ ~- E+ _

: I( d/ j( l- S2 A2 u' J
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

# r4 v% c* R, v8 a  g, N

  • % Q/ k7 ]4 z1 _# u  N( o
  • 0 ^2 Q: z; `$ c! |4 `! B) ]5 N
  • + A5 K4 E8 l5 S

  • 6 r3 z$ }; e: S0 ~

  • ; Q+ N/ K& s+ s" C
  • & R) c- x0 v! K3 T. h

  • 6 m0 m# _2 E9 |& ]7 ~

  • 9 J& h4 w$ Z2 D* _2 `$ ?
  • ( |' P8 ^/ x) J" G, ^0 B

  • ) B8 o- y/ X+ b5 I$ n
  • + X3 Q# x4 P* O3 h
  • 4 X1 ~# J7 a( z. e% D( e0 E* z

  • ' u% b: [# _. [4 c6 l2 h4 `6 g3 I
  • # T0 f5 T/ P  Y

  • * q7 N" q% D. A' c

  • ; B+ P3 g1 y% t0 K% _1 G5 f
  • & ~. F* z: Q, y' Z0 M, e

  • ( d' N/ Q* A  i

  • * [# _3 ]' [/ w6 m

  • 3 ]& d" p% P/ t, m* D) s, Y. Q

  • 5 a* T4 f/ }" G

  • $ ?' M" S  R& g1 F5 F
  • 0 l+ V2 K6 j( l2 s) w
  • ; y2 i, _0 ]' w: w, y

  • ' R5 |8 N' _. V
  • " o* N8 U  x# U8 i- W! r
  •   o8 l; I$ c% Z0 r) G

  •   c& f; z5 |3 t4 w, G
  • ' L+ C. z# x! x& W' m, C* M
  • 3 N* n# d) F$ A* U3 n% Z$ i
  • % j" {! D) V- M5 F" J+ S
  • # |& v) }5 g  c: j  M

  • # f1 f0 l7 s8 j& p" }

  • # m+ i8 l, V6 I
  • 3 a. N( V& x5 G& S  M5 n$ ?1 ]$ P5 \
  • $ a% A- t3 b1 @
  • 5 T3 l: ?- Y0 S* I9 T" c+ k
  • + X0 K/ o  E+ k) W1 x0 V! M% \; g
  • ' j+ n1 G7 x' Z# ~( j

    : V& V! g8 i! v8 l" R% h* C0 Y% `* F

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))
7 x$ i# y" A2 N2 A, ?

8 @$ G5 z% L% C9 d
* [# Y# y' [  k2 `  h

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


7 b; C( e) Q% _+ r  }8 a3 X
4 L0 M2 c& W' ]/ i  q
回复

举报 使用道具

相关帖子

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