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

    ! Y/ ]8 a9 k, e8 S  Y

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

+ O9 V. M0 W9 b6 h5 F
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 2 q+ I, Z& E. c

  • 3 @) A& r! {. B% W7 I
  • 2 _6 j; N! E: R: x* j$ s; P5 q% i
  • ) `3 Y' M0 g# A; ~7 |
  • 1 m( L$ y; b2 H! P# _0 {! R. u
  • 2 {0 B& X  ^4 @7 c4 m/ W% w

  • ) P! l4 V* g8 J' q
  • & c0 V4 w/ E5 e; R, t, b
  • 5 k+ N6 S! l- ^. t

  • * j1 R# B6 C  G+ \; F
  • & A/ T' E. S9 n+ S; [

  • 6 I  A/ q/ E) L
  • ) J$ `7 I% s& z0 \
  • 5 u4 k+ J& Z* X

  • ) P3 l: b- q0 x  ]6 t3 f

  • 3 ^1 X  F; D1 B& c' n

  • 0 i; r7 G/ r/ ?8 l

  • ! Z. \; [5 `+ a! G  n

  • ! g+ }! x" ]& P
  • 6 f- {; r3 d- A$ h
  • ! ~9 D3 h, r2 L

  • * \9 c$ ^  k1 y
  • - f4 g' H6 ]* W0 d5 v5 d$ H. M

  • ) _- e" s  V0 Q) d8 `9 F2 W& ]
  • 0 Z% x7 q0 m+ a& m% v$ |1 h
    / L" f! A# N1 H5 S: {# m6 d, 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")
  N8 Q+ B; y$ x9 Q/ W; ^" J3 r$ p

5 C$ Y) b5 H) z

' x# X4 z" B7 B, B+ G) C

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

! Z% I4 j2 t( y6 ~! |9 I# X* `

  • * v6 D( \! _. ^  i

  • 6 u. K- S; f' t- g% j# X
  • 5 N& Z0 W3 u* Q' p  M! B/ D$ K

  • , ^0 p9 D% L! a; d3 _! Z5 [8 O

  • ) _; R( d3 t9 e0 Q

  • * a: V( u/ }. q% q* A
  • ; [' z7 i- O0 d

  • 6 e! |$ C: B5 m9 H$ N! A. A  c3 B

  • 4 s; ^  ^- x6 y5 y0 o; y" E
  • 3 }5 z9 e5 O$ P+ @$ F- X8 m; E. y
  • $ I8 z& `/ j) G* p6 n

  • ! M8 B) s3 Z! ?/ Y7 E

  • + Q; _3 T, {( r% F

  • 3 j! A: J7 n2 u

  • ' ]/ W+ K" T0 h
  • + Y& @! Q' S% z# H; a$ }
  • . w7 ?- M% q; G5 g  {# d8 R; F: N* e
  • . L+ r% f- l! {) Y

    # ~8 M6 K" J* n, {  U( \2 K. y

#绘制中国地图,并标记各省会城市名#引库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")1 V+ Y: Y; ]4 Z3 V

7 v. o: J$ R; ?1 ~

  t* _( K2 J: j) \' o0 u! L

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

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

f5c3384582002193c2c6c354a3d26729.png


$ S8 k; W8 I* k1 t. L" H
  • 5 \2 e  e8 `5 k9 W7 ?
  • * X4 K( A9 R4 D, ~  F. N& {

  • , e$ V0 p: h+ M) K4 _
  • 6 u4 i, K' {6 O- E8 @
  • 0 [% K' L2 U5 D2 M7 q
  • 2 W2 }! @8 ~1 J+ Q

  • 8 X  v5 U5 P7 p

  • ; u; ^1 o3 B& l8 |

  • : u# L3 D* E; v0 {( Y1 I; j' ^

  • 4 K0 x6 \2 x4 J) W6 y0 O, F9 `* X* N
  • 2 |& t# O) C7 J( |) X; v
  • ( T: b  F. B6 U) c$ c! q) D

  • # R% d( i$ `$ E5 @: C

  • : v) q: p2 e1 q  t* b
  • : `: l7 q. h, W( Y4 g, S# m

  • 5 V6 s, R1 o8 y0 X$ k+ w. x
  • 2 N" ]  [& j) V  X

  • " X  b# w; K1 W4 h' `) Y- f
  • # X4 f0 U: H# ^0 L4 ^

  • ( e  i0 X9 p$ {5 ?# S8 M: o* k+ K
  • * z/ J. d. d, }/ z

  • 1 C2 i7 ^! |1 r- n! k: ~/ i

  • 8 w  _/ c2 I0 A# n& S. x

  • ; S. @' Y9 a8 m5 w5 c; z! m( {
  • ) Y' J9 C3 M* o: Z9 u
  • ; M! u6 _3 H  C) y) B; D

  • & @9 E2 s3 D0 W% w

  • ( h1 H# w  X5 d9 ~* L% p7 J% q+ j$ _2 q

  • : L8 y3 l- Z- g! f/ d
  • / ?1 o5 \: k2 T8 @6 t: H
  • ( P3 e5 r! X  x% J

  • ) ]% q5 p* \$ K& e
  • 5 Z9 [" t( E1 q, ~+ Z0 {
  • ' b- U. n3 }8 `
  • / J* C  y, P4 {  ~8 [5 G

  • 4 a$ q+ o; Z. q' h

  • 1 d7 T. B0 T5 f2 x% D2 q
  • ' k- c; s& e" }* j% ]

  • # Z2 I% D& X# N# T9 X8 a
  • , B5 U, R- Y6 [2 |; e( s
  • 0 U) h4 s" Z/ [
  • ; q+ N3 n: h! c  j2 t" t
  • ; P- E) d& l7 k* _7 j
  • - D8 Y" l5 c' v! }/ M# V

  • : A  @( }& ~: d6 a& h( f5 X
  • & {0 j7 r7 C( p, S; j# K* K" u
  • " R9 }& ~7 @1 |" j. v1 L
  • , H* E5 s* Q' K; m+ ?  C; A0 p$ w
  • . i7 H: U' g7 `

  • 0 [( D- Y1 u. }5 T' E" P! d
  • " U6 \; S2 U+ G% n9 O

    ! D& }8 |  m+ u3 P

##绘制有海岸线的中国地图#引库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()4 s: Q! X8 m# A' ^

/ f" }. B/ ^4 ^: Y0 o5 a2 O) U  w, ^
* p) T- o" b6 R+ X5 c& l! s9 Z* j

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

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

28af454b4567839d9c888c0e3809708f.png

1 G8 b# u$ B7 h

  • / U! ]9 n) |. t: ?" w1 w$ ]

  • ! @; _5 N: P0 q6 Y+ \+ s( ]

  • 9 j- o% u1 o# H  ]9 X) Z2 w( l$ c

  • & r" ~$ j* P: U* W9 q% w& ^+ A
  • 7 B) x: I3 t9 q- l" S6 y$ U
  • + r# U8 }9 F: ~; _7 t5 ]

  • 3 M. t, x/ Y% U
  • 7 Q  [; r/ G1 r  v3 w2 C' q

  • # l# W" d5 B' _# i

  • : o$ r7 s- C9 k- v; b9 o

  • 7 L' q& F$ u2 ~: K5 H
  • # n5 Y1 d5 x/ \4 C7 s) K  h8 j8 U

  • 9 S. F# L! C- |/ G
  •   t& r1 i: o# f( @- N( O9 g

  • . c2 ?5 K# N8 w. Z# j' z
  • 4 w( l7 H7 }7 q: c$ O' n7 f
  • % F5 Q) }( s1 y& g- O* J) R

  • 4 _7 g/ w, ~2 S1 J, s8 Z# I: }4 a; W

  • . {- b. \9 }+ q" Q- M: [* a: _
  • ( h. _( d0 X  l, M6 r

  • 9 o+ i' g: h' |8 t% B
  • 5 S! L. v, \* i2 j. P$ L4 K

  • ' ]4 d! N) l( [5 l7 F, c) U
  • 4 W8 v) I9 p! |: Q7 r4 [1 c# ~( ~* \
  • ' m4 M6 ?* F5 z9 J3 d- X7 T4 c6 [
  • $ g7 z( p  A. I6 w& C
  • 7 a3 |3 |! Y4 n' J- S$ ~
  • 2 l' v6 T* T% l. Z/ o- r
  • % _5 q2 s1 \' `1 L0 r4 _% _

  • % F* r6 w, U' W& p5 _4 j- w8 s. d
  • * H  T2 g9 G; r! }& _  q; @
  • ; r8 b' B' F0 ^7 K" r$ `/ L

  • . a, _) p! ]$ n  q

  • * O7 l+ k# ^; @# s: @0 L
  • & I& R/ t9 ~0 F, p/ o0 a, m% }( ]
  • ; q: ~7 d, s0 @( n

  •   o6 S! e8 A- Y
  • 0 c! d, ~( _! L* T2 _+ H, K
  • ; W$ B( M1 l" Y4 F0 A6 o0 _

  • # K/ C" P% b$ w1 x; \

  • + w6 \1 z7 R5 a" G, F  K- w- t  ?1 {

#例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. n+ T; t# r$ C/ g4 u5 n


" }; r5 t1 p& i" G9 h2 {5 A+ e6 a

; [' U% a- V( s+ w& O
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

% f1 K+ v1 A  e' p  G3 G; d1 x
  • 8 @' }( U. d/ I3 |

  • % p. T% z3 O( [% m3 H, }, `. E
  • : V' L; n0 e8 r
  • ! z/ H" f0 Z# F" u+ z
  • # M; b) Q  P6 c( Z! a3 }5 G/ z% ^
  • $ ]7 U" z8 |! P) v8 {9 d; }# A
  • " _5 C& V  s9 [2 F

  • 7 k" _& ^: h# G9 f
  • 9 w3 j. S4 o# m) [7 {) J% V

  • ! l6 f* G6 n& [( h' C! Z2 l) f
  • 6 |+ ?  a* ^4 W, w$ o( b
  • ! K7 B5 i! g- S% O. p& x2 Q

  • 5 z1 |$ T! l! W2 J9 {$ h

  • 9 n1 P& ^% H; B0 o) h  o) L; r# e" U
  • & a/ w, @0 s! Y0 p

  • + `7 v% Y/ C/ R4 y* P
  • $ y4 e: ^" a; L* O2 o4 h9 f; x! C

  • ) b8 ~5 e4 j' A/ `9 ?
  • 8 p( \& U, v- h4 ^7 O( ~& \
  • / j1 I0 _+ @$ l( ~0 |( y! H
  • - ^7 \8 Z. `+ @0 [, a9 ~

  • $ o$ C6 ]" j" M$ P- r8 Q. x  J
  • % p- Z! \& d# K- w

  • & i( h* ~& ~' D
  • 3 q( h8 a" |6 Y/ c) R! _7 Q

  • + A& y) Q8 v. M
  • ' c/ F, }, U, w/ X$ e) w* y
  • 9 g/ \* F  ^3 B! c( a5 r8 K
  • ( ^7 Y6 `# L9 {* w

  • " O% W% @9 \( r; N
  • # O6 i( o! G2 f; ]3 U. H! {
  • # I, ]4 i9 x5 Q4 P9 _- B

  • / d% x* X( \% E: |7 X4 k

  • ! e$ U6 T$ M* B/ x

  • : Q( q( F" [9 ?4 y5 q* G; F

  • 5 u& \7 h$ ]* i) w
  • $ o2 H! w8 v& G% m- F

  • $ N1 k$ u8 v; ]$ i

  • + F* f( M7 q" E2 e% E8 _! A  v! p" {
    ! ~6 M* x- n" Y& c; B9 S2 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))
$ ?/ s9 i% p5 E+ b" s

: n4 r. Q2 x/ p0 z' H5 L6 k

: Q4 J6 l) _% p

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


( l# g) w3 X/ x
6 [3 h& X) B. E& y8 z9 y6 @. }, D  ^
回复

举报 使用道具

相关帖子

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