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


    ' p+ F) C6 O7 e: {0 G$ m

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

' r' Z# V2 b5 P
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • * o8 T7 N% [5 U/ v1 d
  • " ], ^2 a# T3 \7 t, g

  •   ]8 G2 \9 O' @; s( e2 O
  • 0 U3 {3 c. ?- I& t' U% A9 i2 H
  • ; Q$ x! g# c4 s& j

  • ' O' E6 p) j) k" f+ Q
  • 1 c$ U3 r8 d1 g( @) u
  • ; h9 Q- k( \! E: y

  • & `" {0 {+ f: T$ H( X

  • 4 C% Z7 w7 p. x+ d
  • 1 j9 N0 D& P7 @7 U- i( C. E" y
  • + c! N& R  }% I( q. d# @/ Y

  • 3 M; W* ~: [; o- W' v

  • $ M5 j1 Z3 t: h! g6 [! a9 O+ W6 K
  • 5 W2 g- v9 C5 Q

  • 4 D: ]  T' B; T: I+ z# Y4 E

  • & U9 N$ |4 ]& j6 W2 F/ e( Y- _, f2 P

  • % Y. t  k& r2 e1 f

  • $ Y7 q) N4 P  N

  • / F) v3 l3 F' E$ F
  • 0 U2 {7 V  G& Z& `, o8 P- |
  • # a, d/ Q4 s* B# p. p7 J2 }% v
  • ' y0 h/ e3 e2 o! b" V. W2 ]
  • 6 ]: ?( Z  R" t) E( r

  • + T- l& R% w3 ?4 h: E( o. ]1 J" R" Z( l' [; W% D  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")
" q8 \' Y) l! O" N+ Z. F- @

' O4 y! n4 D6 L5 w( r# B) Q

6 `0 J# u) v. `( r. S, M1 b

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


1 b1 Q0 \* d8 X5 [, H6 Q9 r2 R

  • 5 R0 p' V8 P! F1 T' ~5 n
  • ; k1 R" c. R- a8 U: h6 y
  • ( b2 s+ L6 w8 q8 N/ g

  • " e+ }: F4 ~3 L+ U' g4 E
  • 8 D! w5 K* y$ e5 ], n1 y
  • : k8 W) P" K7 x- B& f4 ~* I) [
  • ( \! v% ?* o7 Q

  • 3 h4 X3 c; o' v! i

  • + y" X: b$ g) ~2 K$ n

  • ! G3 [8 E) U1 [* B9 ~

  • 3 d" E) e3 v% R+ f8 A1 ~" o2 L

  • ; t% `% s( s8 n" [1 V% S; n

  • 5 O3 _5 n5 u" W* U4 [6 @
  • 1 ], @; C  J: u) t

  • ! y: V: P- o/ H0 _: C3 E8 K: N& i& T

  • 8 m3 h8 [; ^) G1 O/ s8 w7 Y
  • . C4 H1 p" v+ {6 H) P/ p, \" D' F

  • & G" M% X# @& m" j8 x' d
    7 B/ o* R1 J: ~! T6 m$ p- m

#绘制中国地图,并标记各省会城市名#引库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")
, b, U9 U6 w( n  q


+ u/ w( ]7 {3 {& \0 S
6 y- E2 U+ g3 f8 ~

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

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

f5c3384582002193c2c6c354a3d26729.png

4 x  S1 p$ p' f/ `
  • - e4 j" E; `# Y0 y$ N+ M
  • 9 p4 ~# S" |  l) m4 j* D

  • 3 w% E$ A; E7 w/ J/ a5 j0 H

  • ; h) \/ Y. {% F
  • 0 ?4 D+ s0 q+ L8 |
  • , K" A4 d2 E' V, [, m) j( U
  • ( l5 W& ~+ @$ r2 c- ~# s  T" j; n

  • # `" t0 |. O" D

  • $ ^6 R0 \9 O6 `
  •   P4 W) W! s; Y8 J8 c0 M0 y
  • / i5 s  e3 K6 K: @0 \: ~* y+ I
  • / G9 z" |1 V" n/ S$ J

  • 6 F( o6 @( h3 |) ~: y

  • & @- ~: p% {7 F: \8 Y: z

  • % D0 c4 G+ ]! B% B2 i+ o

  • 1 ]4 j4 u0 T- X( a) j  y

  • ( L( a( l6 z! o3 I

  • 1 [; ]% g2 b$ v

  • . n% s$ F) B" `& {$ T* R

  • - t3 E2 h. W2 L% c5 N, D7 R

  • ) {2 ^1 r8 q# t2 X

  • 4 W- D+ B! @8 U1 |7 h

  • ; ?6 U5 J$ n9 D
  • 6 j6 h. b9 ^( b# _- p3 d5 @3 I
  • & F8 c/ k: M" }
  • 2 B* m3 l. H' o
  • 9 g8 y& D3 q" J" e( |# G

  • , v8 v/ B1 _9 d+ h6 E( o

  • 7 [) y# ^) {+ }5 f9 i
  • & i+ H  a& K4 L/ S8 ]$ N! Y

  • : l  H8 w, }5 l0 K6 D8 q6 \

  • / w" o. H5 g  k* Z% t, a1 s  d

  •   _$ Y/ Y5 P) I5 n0 W

  • 1 l) h' r+ s) c; _) ^8 I
  • 2 E5 J+ u! B4 r& o0 c8 D/ D

  • - x% m. P+ A: m% U/ ^' @( b

  • : q; v( O4 h; W: f4 _/ N+ p; }

  • 5 H7 a0 _* }  ^1 a" I; C* |4 F

  • ! G8 z8 [7 [$ s5 R- C9 B

  • ) @* B2 W  E; E9 Y7 {
  • 2 ]- @2 M. r5 I, ]' h
  • 9 e+ [* K4 f, }
  • . R9 d; p' D) f4 }" d% V2 r7 Y
  • % d% p! k2 r  [& K# t

  • 0 w: `+ A- {" x+ w4 y) y

  • - {1 s& g$ W% d

  • * m! s3 e; ^, m) d' Y7 ~
  • - [  e) e) R) }4 W5 E' s  t

  • " \- |# B: X0 g& j- A

  • ! y$ Z! K9 O/ ^- U# l) n: p

  • 7 D7 f  T2 I: J
    ; B9 y& e8 [4 c

##绘制有海岸线的中国地图#引库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()
5 v8 ^7 C, s8 L; {

% o$ w% z/ }1 E; M9 y+ N! f

8 j' G! L: c) T4 o1 X! p

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

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

28af454b4567839d9c888c0e3809708f.png

; V  }8 B5 R* E; C7 \; j& @/ C

  • 9 f+ b2 R. J8 B. K3 t, g) J

  • $ e4 D( t6 J+ M3 N6 i, b' n
  • . x0 O+ i6 ~1 b% q

  • ; o& t* g3 Z( V
  • ! r# E9 s0 Y. h$ x4 b
  • % Z6 s' m& `+ E$ P/ {+ k
  • / |( H8 c% c; q- Z
  • ) s  ]0 B) O; |; h2 B
  • # i+ U  s! p0 I1 l7 o- J

  • 6 l# k$ E3 P+ h5 Y- z0 M9 x
  • 3 X% ?  j+ g7 y" i
  • # c) s6 R9 ?: g0 m* |
  • " b9 A2 a( f7 A7 `$ H* o

  • ( ]1 R3 y; P: ?, _' ~% D

  • & A! _# J" W3 h/ m# F$ ]

  • " d, A9 L: u2 I  T  r. N

  • ) z# B5 W, b% N5 r) ~, m8 H2 F

  • * N# d+ v* c- r- n6 [+ l6 n

  • # o+ C  s9 i: r7 r  ^8 T# I

  • / M0 W7 k* t, ^' {9 K

  • ! c$ S1 F3 x1 K+ _4 m" k: }  u

  • ) }# l. E2 |; I0 m/ S' T

  • : b3 o3 @2 m2 H7 B2 x( @4 D, U
  • + j5 F3 [0 N+ G4 I# U0 z, ^! y
  • $ H! O3 r* F9 f2 Q/ C

  • 4 b2 S$ O; S9 q: U

  • 5 j' y0 R, _. h& q7 W% N) E

  • . q1 P! _* Q: q  P8 x+ N8 v

  • : _/ P; u* H% H2 J  i2 x: t; h

  • 6 C: W( I7 _. i6 x7 ?$ S
  • # D- O1 b/ f0 s$ D" Z+ _

  • & g8 a4 P$ N. R) E; J3 Q

  • . `/ l  k0 g+ k6 `4 L/ H' n

  • ' a9 z0 c& I$ F* a  A' a
  • ! {; E. C2 U- w9 E  T' _2 P
  • $ O  o: {6 n9 k! S( {- A7 r

  • 4 I( }% E' }- [
  • # R: V3 a' w& p# V& U- D. z
  • ' K! `" \& |( R
  • 6 f" V: ]6 \, t: Z
  • ) u+ R* P1 u7 h6 _; ~  g1 i

    : H: l/ ^4 I0 n/ v& x$ ~5 d

#例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))
( I6 m/ f! x) f* \


: J+ ?# m6 _: J/ ^


1 A6 g+ k8 j1 H3 F2 T' `                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


3 |+ s$ N5 t! Z  A! ?
  • , F) G% A$ X# d: Y9 G9 Z& R

  •   b# K1 b2 j! f6 P
  • , b. b3 F8 _' H" W2 V$ b! ]
  • % ]( {) v, p; g  J/ l1 [

  • 9 L7 [, ?) [/ R1 K) ]" G
  • . P3 Y$ w. {6 i1 O& m' ~
  • 7 z. m' M7 k4 k
  • 3 @4 v0 J, ]. H% ]

  • 1 T: a: H  R$ z1 }
  • ! E% r' r$ |/ |" X- C3 n2 Z
  • 0 R% j) u- D3 L3 ?* y6 e

  • 9 }2 K& t; w9 d8 R) f# H7 G

  • ( a: @. B2 k5 o

  • ) \' e0 n( y- }$ g/ ]6 {# \

  • & T  R4 s/ `3 {3 q& A4 p8 V

  • 5 B: e9 C7 A5 I5 q

  • # @" Q5 h2 @1 j) C' l7 G
  • ' w8 Y4 h+ n: u; b  ]5 l& _8 k
  • . A, S4 i0 G& w1 J3 m+ s$ ]: H9 |

  • 9 l* N( V/ m" r, d% `

  • 2 K- |* B, p/ N
  • 3 R; i# J- x1 b* T% h% u2 g
  • 1 f% O2 A/ ?6 \/ e- N* X. t6 R
  • * B3 d7 ^  w0 ?! L
  • 1 j" X9 I0 A. l! w4 H" ^' z1 T

  •   j5 q" L- t3 ^; w6 P% a; J* y
  • - [/ `" T) C# L% ~- V

  •   F+ j! O' g9 Y& N

  • . D$ O) V; U( @6 ^/ S  n

  • 5 q5 @1 a, D/ V6 }/ o7 r

  • : R$ h; ^7 ]0 l- g

  • ! a; {3 [# [8 `, T: @% ^
  • 1 I) T& j, R, K) w& k
  • 1 d9 Y, h4 R8 t* Y/ }

  • 7 ~5 H9 f( W8 x2 c* ?' J. S. a

  • 6 Z8 l& y6 A$ b: m

  • 7 O) I2 D- H/ x( a

  • * ]% h0 g) f8 `0 j) o- W
  • ( [5 h7 M4 H( z! C

    ( ^7 V% e6 b5 b4 p) l4 ?- d

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 o/ q1 `3 ]% T. h0 e5 c


% C; |" y# v5 p  k4 z: k  X  b' Y( U" N$ K( ]( i5 @( I" J2 k

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


0 V! g) M) P( h0 C
4 V8 D0 E' M+ r; U/ v
回复

举报 使用道具

相关帖子

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