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


    ; Q! M/ l6 X2 h1 t: L- A

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

- t$ i4 B) X1 E! M' R- F5 N
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • , T1 Y3 P: V& U# i% }

  • 9 Y' f$ k7 z0 {. a
  • ! w" ]2 T; c- `$ v" B

  • 0 @9 W8 G/ M3 j# D) T! c: B& B2 n

  • % ~2 i9 c+ R$ r9 @* v
  • 4 J/ O8 @- z* K, b

  • 7 \) C- _3 y% [. \. o$ m

  • 4 [9 b# n& U# z% q- W

  • * p! q& ~! a# b, J5 ]5 v, H

  • / v# J8 q- L1 \3 n5 I. A

  • 4 C, M7 t5 i( s5 m  e9 I# v) Z& M

  • 8 o% w* F) a6 N# P. H
  • % X2 {/ K: B* @5 e: e7 O# G$ T
  • 6 r* n  C! i2 Y- o: ]

  • & A4 g# v+ @: g; m$ S
  • 9 g6 Q9 e: p, G) {
  • : `2 H# l# H' u' K

  • / H% {5 o% a2 ?, X
  • * ^& Z  v1 Q" B/ O
  • " X1 n2 N$ U7 m  G  ~/ ^. B

  • 4 K1 s4 g* T# ]. S2 I8 T* x* D

  • 6 {1 |( b1 x, F  R5 ?* F

  • ) @! S' }4 a: H# }, b3 F2 a
  • . o/ u/ J+ I: i1 R, i, }' g: g% t0 w

  • + b  X6 s: y# V& d
    ) i2 r% n; M6 J) O" U+ C4 |7 c7 a

#绘制中国区域基本地图轮廓,包含省界#引库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")( X$ ~: n! R' ^+ }( e) H

" `3 _! W' r$ U5 c! `8 k9 \9 W
& F1 ~- g! d3 V% \

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


: N( ?$ C( i% V6 T6 V- z) _. a
  • . h" V, j1 I$ ?3 M0 t
  • : d% F+ }- D" }; r" Z
  • ! p5 {  z9 ?- L9 h* z8 ^7 j9 N
  • 8 N  L1 M, f5 a0 D; O
  • 3 m, `$ J  C" _3 M
  • * R6 T! ]1 ~+ O5 x& t# h

  • 4 R& y- X* x! P! D& C

  • 1 T# f  c6 v9 K
  • " V- M: g7 ]9 H) u9 s
  • $ p: R$ X  N' e: E
  •   x0 y3 U9 }( [6 H. A1 x4 ~# G% j
  • ) V8 k7 I3 U! R

  • * A1 S! @& s) e/ g9 B  c8 J
  • ( o3 [* R( c% n* x  t6 O- ?
  • ! K: c+ i* i# B- O

  • ; R/ T* f: I( f$ P

  • ! c$ i3 f7 c% }/ m9 t0 H

  • 1 N% V- R# _. L- S$ g
    + R& d9 `* T' O$ `

#绘制中国地图,并标记各省会城市名#引库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")5 U2 I7 C9 U. G2 P

' d! ]: J% Z0 I1 a" c! p

3 Q, s7 ~4 X8 [+ f$ P

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

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

f5c3384582002193c2c6c354a3d26729.png

& [: w5 e  B7 F8 g7 K+ F. L

  • 8 ?8 C9 R6 S( T& d

  • $ u, R: V* ^+ t

  • 2 a* m9 O+ P3 g; `0 |7 z; \
  • 4 k8 ?: T2 ?) Z

  • 0 c5 t; Z6 Y& {' A: q- U
  • 2 v2 {) l1 I/ t

  • ( e0 D2 x% X) r
  • ; U2 j# g3 S3 |" H
  • 6 N* O  h1 i1 h% w# b. b. U; ]

  • ( `1 P# r8 [% `5 `, G

  • , f6 z/ k" ^' j& F$ P  W
  • : V# T# D! _6 W0 t/ c8 y+ [+ S
  • / w+ B/ B: ]6 J

  • $ y) w8 v' C2 H" p" Z8 ]2 d
  • ; X- \+ d+ [/ M9 [9 w2 ~

  • . s. Y( O# O3 D/ d% _; W  C& _
  • ; Y, v' u4 b1 Z$ D
  • - T, Q( E8 j6 A9 v6 G8 B5 t- A
  • 7 H0 s# @- X& _

  • 7 k7 \2 R4 g  H' T' `+ R

  • % E& g! N7 g- R' |$ V" Q- @

  • 4 [0 Z0 A; {, _( `' J' G$ p5 t

  • # F9 B' ]* U, {4 [

  • 9 p" |$ R7 H( Y) n/ x, B

  • 9 {8 E% b$ m! c; O, k4 d

  • ! G" T" C8 j! }

  • ( C4 U! ~4 M; J0 r6 F7 J2 b& _

  • / B* c& l  J! v' N

  • 1 [& I- D$ T3 {; ]8 n  w6 b9 F

  • % F6 d# ^2 k8 I& v* D( @/ q1 z
  • ( A* L5 \. E, x$ _, G* U* `

  • 1 b! t( K* M0 ?  p
  • 5 x" N! x  {( `4 I+ k
  • 2 \5 V/ y7 c9 I. N; ~

  • ' y9 `( K& u% a
  • & ^/ o+ c7 l; M5 C- _2 o8 `9 @/ P

  •   V7 @7 p" \* H; S* v3 |
  • - h" ~2 w9 w% F' G8 x) r
  • ! g# E) B0 m2 F
  • : @! J* |) ^9 a7 R
  • $ i, B; ]" ~: J. F; ]
  • 6 a9 @4 T& T. [0 T/ {9 A3 L

  • ( N: j* [! P  H& q; C5 A% C- c
  • " a' d# H, E! T# b% W- L

  • 8 G% [- w- @! P: f' G3 x# \1 d
  • , m* L+ Y. s- f5 N- _, ]( z/ i

  • ' U- l" m3 @: Y
  • ; k6 b. a1 p' Z4 T& a, V6 J
  • 4 C+ x1 O! ?/ P0 K- P

  • " Q  C4 C! y. h9 z/ P* q) u
  • * D6 }" ^6 z  j3 N5 E1 h
    6 U- r' E& D' w

##绘制有海岸线的中国地图#引库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()' \) e6 j1 g$ }1 i+ I0 `

5 M- a# D. {$ W* _

! T/ X1 s3 I+ N! W, g" e# k

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

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

28af454b4567839d9c888c0e3809708f.png

+ F8 X6 ~2 i6 x

  • 1 ^, h( n, o% o; s

  • # K( D( ~" t$ s" h6 F+ _5 _+ J8 U
  • ' w. N8 z& @1 ?* f7 c8 B

  • 3 v) A: }' y3 @
  • - f. u  _7 o5 R3 I1 K
  • ) n$ T! F2 C" K$ I* C

  • 0 s- R  L8 w5 w# }: M; e2 s: t- P

  • $ K4 w% ~& w6 F4 j$ K6 o" y8 D' j( i
  • 1 m! x2 G4 z' a: v' a& V

  •   I) X' T. g! _
  • / }7 i8 P8 ?) a( e
  • ' K; v$ y9 F( ]. o6 g

  • 3 _* N) O! K1 Y, K* t. U

  • 8 Q0 i# \1 q3 c# _$ F; i5 j

  • : k6 }+ S1 Z8 N% j( L: k9 V3 Q0 r/ [

  • # i7 K5 [2 |& E6 Z  }% O/ F9 j
  • 8 x7 ?4 s- o% i, s! S" c
  • ) q1 r" {; g+ @" `* l, Q3 a2 p0 H+ P
  • . S' @( S8 m, V: M5 h
  • 2 \7 S5 [5 z. x0 L% l- s

  • 6 x  N# a; R4 k+ `' o3 c
  • 1 `% e) {9 A: {2 T6 H( Q; w
  • ! w: F/ E0 @2 ]# _, m& Z3 `

  • ( t4 k/ e8 H2 z7 H

  • 4 m5 r: y# P# e  ~" W0 b
  • ! x% m, W: t2 |$ P4 [

  • $ z9 B  v4 U2 }2 m% A

  • 7 u$ K3 O8 D: V. z; B
  • 2 X& A( F/ v! e7 n+ |/ w

  • 2 y' |+ c, ?' S

  • 4 l- Q1 j. Z0 D1 y0 i7 _) D0 Z4 [
  • ( u$ B! n0 o/ ~9 i, t+ v
  • 8 l! G  F; D* a/ w' h

  • 8 z" R; R. _4 |6 U  [

  • $ M4 _/ t# H3 i0 s2 V$ g

  • 4 j& R+ Y! H3 j& M2 `) C: u$ l
  • 4 w0 D) L4 n" b: `, G& q* ^+ f! d- I
  • 7 I1 k+ }; [( w" c6 E8 J$ _. m( r
  • ; H, t$ m9 M( ?  a
  • 8 N8 S7 ?4 W( K
  • # ]9 v" ]* S8 o/ S/ g. N/ Y4 N+ v" x
    6 M: f' p- `$ R3 W: z

#例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))
( Z% M8 z, @2 _3 p6 l


) ]1 z- s1 [- q# d. w! ^4 n( s& O% B4 E

, [, i# V3 n; X2 @
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


6 a4 U( j: M9 W% F- |# m
  • 9 c. W+ v$ ]" _% ?. s% m+ Q1 l

  • . |  g/ u: }. V* [
  • 7 y9 o7 v/ A+ h+ G1 Q7 s

  • 4 d  ~5 Q& s. R
  • 0 q, @; B6 o/ x0 r

  • + d7 M1 S% ~1 B/ g, r- A

  • 1 G1 T8 ~) v  n
  • 0 l8 A) m' m( Y
  • 1 h6 _, D- u. v  }1 l- O% B
  • * H: m% l7 Q. w" |4 i
  • / L6 ]0 h4 g$ W/ F7 ]# I$ I
  • % @& P. V5 r1 N1 v7 ~" j3 h
  •   ]) z' ^& }, m: {1 y

  • 9 s' d4 e% W2 M1 l7 ]7 u: A

  • # K( i# D! V  y0 E

  • - }, X" J" p9 N4 x2 h

  • ) L" g- J0 Z5 e/ [$ W. g4 w; }
  • 1 r$ m: H6 b( a5 e7 Q7 D" A

  • ) P: v: {7 i( K& L/ {
  • 3 `4 k2 V3 v; L
  •   p+ v  z6 I& D' F2 T

  • : P$ @8 `6 Z9 b! X# t

  • 7 @5 G  P0 I5 o) R+ d$ v; M

  • " z4 k) Z8 q" @

  • # J% \! `2 d/ f8 l, I" G
  • + u) S; w4 P( C) x
  •   ~; E- h% n& b1 I, i4 ~1 S0 Z

  • 6 {0 B3 {8 B+ r# A& `+ m! ~% }
  • $ `; U- `( d5 [, ~; j/ z7 K

  • 1 S4 d" ~' o6 b+ ?1 Q: z
  • ' M- m" T" X; d
  • . ]% t8 ]: F. t
  • 2 W! R3 a, @/ X+ E
  • & G* t" [, H' Z+ }2 f3 e3 ~, w9 o* T
  • 1 O- J# k) o% M9 R! |4 o
  • 4 h# A$ w7 r- D3 }

  • 2 f/ D! y! ?- k/ [

  • # c3 p7 W. O. {! _1 V' M0 e

  • 1 A! z8 e8 A' e: r& i' t
    + q% W) B, w9 M# f' o: u- q

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))# Z1 z8 ^8 k( t0 s

7 e% p# V1 V0 K" }

* t& W3 o/ k8 S. {

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

( A7 y: z' L% l1 ?
) K7 {2 f* e- Y) N) V- V
回复

举报 使用道具

相关帖子

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