收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 e3 l. T, R. m

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

% }! m6 p, P6 \  L9 ~
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 2 l/ d. S0 F4 U& n. F0 X  ?

  • % n5 H. \. o' y. i

  • - Z. V+ F4 x% E; ?' e
  • , n/ X3 L7 @/ s4 @9 e2 b; k7 k! r

  • 5 }( z& D; B! ^' K! a
  • ; a" ~* J+ l+ p- A% F- S5 ~
  • 4 G7 I3 v2 N! v% c0 a4 T: l( i* d" f
  • : `4 b6 }+ K& n. e1 w0 b6 b6 U

  • : q7 O6 d; t2 J5 P6 E* H2 \  o6 R
  • + F9 y' a( d# c' _

  • % F4 L6 z9 K& L0 |& l, a: x

  • 8 \: r) Z8 _& e- X. D' e
  • . W) d. U- E* ?) Z/ M
  • $ ]2 }0 J5 d2 n7 M) x0 G& z- @

  • 6 s0 P5 s% r* u) E" P0 [2 d2 s! A
  • " M" C- r* m, D; g$ ?+ c/ U
  • # ?' W7 v4 K* s5 U6 Q
  • " Q7 y: h" U8 N8 i) j

  • * P2 w$ B4 U; n- [9 c5 z) |5 K

  • % H1 c1 a& J( ?3 D$ u
  • ( h* V. Q# e* y3 w( a
  • ) b" ]. c6 O3 g( W

  • 1 h9 m, \- y+ ?0 K4 R$ j
  • / w7 ~  o" s5 C" j& X( o( @# \

  • , N& v/ |4 ~- o9 m$ J
    9 u! O. y4 {+ E; ^  R/ I$ b

#绘制中国区域基本地图轮廓,包含省界#引库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"), ^% g9 f; a- A0 o- n

" F- e/ [2 K8 z5 h6 x, p

3 K( Y. U! x) p6 \

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


1 H1 v2 s0 r* D) ^0 W/ |, n

  • % R0 X9 U/ T# k8 z5 ^! [

  • 9 K% \% X2 c" D, Z

  • 6 @- E2 O% n! ?" [
  • 4 z& s- q! _7 K% ~; L

  • * @$ B! U. e! C$ q: `- [

  • : y4 y% z% c# e% v6 r2 @# f" p, E

  • ! G; `* i  V; _3 m! G5 ?

  • , X* u3 S: ~, f: f) k3 J
  • & f; G2 W1 n4 ~9 r

  • ( A, {- G2 o- G6 M

  • 3 s1 Q5 y3 i9 _! }- l( F

  • " m5 o! J/ m7 W# {) i

  • * c' e' V% z# Z. ]* @
  • 5 ~+ u9 Y/ _: g! _0 X0 Y- @

  • 9 T6 Z" g/ `. c7 S& v# _

  • 8 ]) O' L# A. Y9 [+ J

  • : j% R1 ^1 {. `
  • . K' c5 |4 W: N( h
    5 l4 k. B' ]* c' I/ U4 L

#绘制中国地图,并标记各省会城市名#引库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")
, `" `( q. u8 {( c1 e, D6 K5 x2 `

# U  U7 n, D" ~/ f& Y
' U0 U" O9 a" a$ c6 D

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

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

f5c3384582002193c2c6c354a3d26729.png

6 f6 k& Z9 O. p/ y7 l9 g$ P

  • 7 F. Z- v- S" r. y2 O& E" a/ p
  • ! y8 i- c+ m1 i: W4 J# d* ^6 l

  • 1 a. e/ [/ d$ O& ^

  • & N+ J" ]% s4 V6 c7 D/ x

  • + x# X6 F5 O8 [+ H

  • 2 u9 V- i2 v. O+ t/ I2 P

  • ! w6 M; J0 N! t( m" F
  • . ]% e. `. t5 n
  •   p# P$ e- b$ y

  • * j' u: A9 G- i; P# @/ o
  • # G3 b- g/ _  V& s

  • + n1 C5 f% V# I

  • 7 c5 b/ u/ k( L. ?5 i7 Q
  • ; U- N% V. S$ }

  • * ]& \- I8 i* g$ N8 ~9 C

  • ( B: w* v0 F. M0 E+ ~. @% \7 z

  • % [+ d0 P6 F. l
  • ( u. f' g; I+ ]0 y" |7 p4 ?% Y

  • $ O0 x3 l5 o" Z3 @# e5 z
  • 8 w$ @8 J3 I+ r
  • ' i, g: |* c, r+ K  g
  • 3 K& m$ x6 v4 l3 T; P
  • - k+ Q! i7 y' }- |' u' E6 c) X
  • : q0 C  _: n2 o( f* j1 A' e% S

  • , H% o4 y2 l- {& V. N) \! L6 C# {

  • 7 l3 Z9 j( k- j) _# ?0 V8 b

  • 8 M, W; R6 o9 v$ I3 P

  • & u9 c$ N( G3 O  M9 @; K

  • $ b$ `' {$ s4 r6 V
  • 3 o! ~# Z6 z/ q; L# O5 A8 E
  • , `1 [) N/ P8 m9 [! T
  • ; e2 J8 o& i3 g

  • * }& n/ F0 V6 [. g' g. h
  • , B' ~7 z1 N  N8 K# D. x9 N
  • * R5 |) Z2 b  z6 {6 x4 a
  • ; Q; |& g0 O' O& N

  • ; t" m( {  y5 T: u& n" t

  • % F, u- h* P: Z. K$ X( }) A

  • 3 A% F0 V8 m8 l$ d/ x0 R
  • ) G, n4 Q* D& ~. S& m3 |
  • & A. \9 P4 U) i( d( h: [& L
  • 1 M: J5 k: X3 T! X+ }+ k- ~3 S

  • , f. M+ V' e7 I  o0 Y& n9 ^  M/ Z7 l& l
  • 3 z/ a3 ?0 ~/ Y; V1 K: c
  • & V  h' H) [) _$ H2 C# ^& `

  • ! \, x& |+ x8 [; X: x' m

  • 0 w7 l. `7 G. V
  • & h% M! T: D) ?5 R1 s8 i, l) ?& P

  • 4 Y2 ?# f; o) x8 R: o
  • 0 P' G* E, @( I/ k1 O
  • 9 E: V; M+ s' A

    ) i7 W0 p" m7 Z7 Y- f

##绘制有海岸线的中国地图#引库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(); o4 L6 F1 d6 Q! u# F, |: ]. s8 P

6 P( M& [' s" B, h- @
6 O$ f& F5 V4 ~6 h

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

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

28af454b4567839d9c888c0e3809708f.png


+ S. _5 I4 D3 ~+ L$ k/ }
  • ' N+ {" P  s% E* d; ^+ h5 H/ y6 w

  • # P6 {6 G& z* h# q
  •   D) u) x0 d* K" e. u

  • 6 k# ?9 s( [: I5 y2 o4 E1 `" \0 S

  • / F4 q. s7 X9 Z! s/ }
  • 6 {( x6 k9 M/ X+ z7 U; K, Q/ A, u
  • # x1 R3 h; i& h
  • ; c- I9 i0 X# `3 v( i8 n( {2 c
  • - ~: w. D( a( ?2 X' p" o# N
  • % S7 `; g  i) U& _' B6 O

  • , e  E) T+ B9 C9 b5 P: N" r% C' @

  • 2 a3 t. B+ M1 B) R1 }6 b

  • 4 R' n) L' ?# d

  • : U* f! I; D2 ~9 j; l
  • 5 `! n( Z" A, Y+ w4 o5 M# ~
  • 4 B, M  `* H7 L7 x3 z3 e
  • - ?/ m! ^& ?0 V, }1 \" I& H
  • 9 k$ `, u" w! L6 P0 `
  • 5 H+ a! e( b+ i6 y& E

  • 2 H2 q2 |/ o8 J5 a- ~6 q1 m; y

  • 4 _; ?6 Z  F3 ~! o  y- P; m* E

  • - n& I; N" R; H2 j8 x
  • ( n* `1 R1 E$ g$ t
  • , S$ W$ V& g3 Q6 k0 y

  • 6 n4 R2 ~* O" W

  • - Q' P5 g+ E; m* g- N) {
  • / F# q# i" m9 {, _0 x* }1 c2 C

  • ; B5 q0 f  b/ O. a3 o

  • 9 i! }* a; D2 z/ \4 {: Z
  • ' `6 [: R! S2 N/ }2 W
  • 4 ^) M, |7 G% S% s; f* [2 l. {
  • 7 [5 b3 |) t+ `
  • 8 R& K# [+ u$ X; t$ i5 r

  • 5 S* W2 H+ Y% G7 U0 V; @% ^

  • 1 P, u" q' e6 \, v( `

  • 2 _- `/ W! W" _0 w+ S  i
  • 9 c! Z4 p* K( S" i* n' |
  • # {4 K+ R* b8 Z# y, B
  • ( D, U$ v2 U+ M  t" X2 h
  • - F# f# m$ j% Y! D
  • 4 X' l2 Y, S3 z- v& Y  I
    / k: |6 b! u7 ^

#例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 @0 `6 H. ?! k

0 M/ B- |. q  K# e& }# O


! w" b. R  g  D9 q/ K                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

5 r+ _. w/ e/ v: ?* E0 i  z

  • ) M8 }5 G; p) N' a4 R
  • : n0 a4 v" Q' `
  • 3 |9 J2 M8 \& I3 y! n0 h
  • 1 B" x/ N- x, h1 g
  • , j* R- ]; l  P$ }- Z3 m. w
  • 9 M8 i" }; }' m  L$ `3 H2 E
  • 1 j5 X6 a: q; e
  • 0 p% A9 x3 |& k' O: d( g% p$ I

  • 9 p" s1 h0 G* n# f  s3 |6 Y
  • . i" u; e' a% ?: v/ t$ N- E. r1 {; i; Q
  • 1 i) s  Q* D* o2 c! p$ N

  • # V% `) B4 ~' l# b1 R- K
  • 3 d* ^" M$ N1 G( f5 t; c& u
  • 3 i2 s) h* P: \3 C2 l- p
  • 2 r7 ~+ K* D5 q, s1 L- G

  • ; o9 @3 r$ `( y/ |

  • 4 |+ P, r; q9 b1 |6 C" p% r

  • 6 R$ @: h2 h0 X

  • 1 R/ e% U; U/ ^6 z4 W8 S& I
  • ! V& }0 r9 g) p; W) H
  • " X0 z$ J; I8 B( E" |; O
  • 8 `$ ^4 ~8 W0 S; n- b3 U! }0 `$ G
  • ' q9 J# _$ y. @  F

  • 4 m+ A. U% ~# k2 e: {9 b' H0 ]/ r
  • $ h( p" P; |4 H+ A' V% u4 J
  • * d) S" {7 N( i" u. |8 x7 m: E) T

  • 3 R+ E2 n4 G9 R) Q$ ~+ i
  • ! ^2 K( O2 q0 l  H& [( q" l
  • , v2 v5 }) e2 X3 ?2 r
  • . W% C+ q& w5 e! z* U+ d2 @, A) e
  • / B8 ]' u$ N; V1 t$ J
  • * d% }0 s' H" \7 x& G& K
  • " ?; b- T% u& R% V% E& T6 p0 T0 g! R

  • 7 e# E2 h. a7 b. L( x+ o) A8 t
  • 6 H! Y1 D3 S# f+ `1 v& T' }5 R

  • 8 q- {( Z1 b/ H0 o5 @- k; A

  • . x4 ]1 O( B6 `0 Z; j5 ^" g! S
  •   F: ]! D+ m0 g+ @
  • $ Q* r; f$ u% w$ q% n9 j8 P& O
    4 S7 o6 T# Z" v, U4 T! L

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))
2 R* w" ~* M: C

! f! Q4 C. t7 R, r, g: I3 T; |7 X
1 g8 L( Q# J. I0 f

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

/ P+ ]( @" R+ z4 T

' h* v- S) r" c* s4 [8 R
回复

举报 使用道具

相关帖子

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