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


    # ~' U# ]/ _+ R/ X

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

5 N  Z2 Q+ o0 u/ D5 Z8 E/ S
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • , @$ I" U+ }* s0 c

  • ( @7 x6 ]) D; o$ E) g! }( [

  • + |# o+ l# c1 ]! L) O  g7 V9 m: C7 Z
  • 7 H3 Y# q1 a0 X0 `

  • 5 H1 B3 i% w% m1 a& g- ]7 N! z5 d

  • $ n6 g- y2 j& _6 k

  • " s" G/ X/ k7 E- M

  • + {, [2 T& y, w! X/ _
  • % ^5 [& C1 \6 S

  • - R2 w& O+ e0 i
  • * c$ C  O0 Y( h( a1 T; m& p2 V" m

  • - `9 }$ C0 C7 \7 S
  •   G5 J4 _0 ]8 M

  • ! V6 t, K: _+ U4 \; d: _5 S
  • $ A6 C4 w( U- p9 t
  • ; v6 U6 D1 J0 H/ ]3 r) [0 Y

  • 7 L8 K( e! k8 Z8 L, K
  • , l+ t2 A. ^/ c8 i

  • . }9 m8 N) E6 v% _, G3 @4 R& |) k

  • " E$ q: N2 `& ?
  • , p$ b) \' E! r

  • 8 F; {/ d1 v( J, }; o

  • / ?: h' V/ u: C+ \
  • - i) J) w9 m. p" P% R

  • ! A/ p+ a/ O8 D( C+ M7 T
    7 z( E. j% Y) l- U

#绘制中国区域基本地图轮廓,包含省界#引库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")
% @* L0 d' L& l( I/ x

& F  I3 y8 H3 h5 v5 c1 E
: o$ F2 o5 \2 }( d  Y7 K

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


4 f6 R' H& @7 [5 I
  • : `/ t! K3 }4 j' M
  • ; Y$ N/ n$ T8 [
  • 4 ~  p! `- K8 M6 ]4 k+ ], b6 v# p

  • 1 K$ G0 Q( v& b/ x8 e

  • ! U4 w: G5 [! d
  • 6 V: C, I, v" n3 U
  • 7 T2 c9 l! h8 ]1 h) {# h' z! C

  • " G) I2 p$ v4 L! ?+ [& t# R
  • % F1 s1 Q2 Q' E: |- y: w2 ~
  • 7 o; V; Z2 @6 ]  |# T
  • * ?! ?. t/ p( w
  • . n4 p- D# U% P4 `. z

  • ! q8 l  R, X$ f9 B$ m" ~- @

  • ! e+ P6 \% W& |8 R
  • 6 E/ p9 e" `8 X/ [) i) @# `
  • 3 P* S* ?& p0 M1 d5 @

  • . l3 v& {  z* N9 ?8 F
  • , L2 j  u9 @9 r* k

    : i; ]/ ], G, [5 Z" Q- g

#绘制中国地图,并标记各省会城市名#引库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")
* G! \: B5 o* c8 B6 Y6 G


7 c! ~; ^) S2 A, T  z
& @3 Q- p0 B+ j# _- }1 |) H. N

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

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

f5c3384582002193c2c6c354a3d26729.png


# s7 i4 O/ {( B0 i) `  Z
  • ( A( L, o# x/ s! K; P
  • 5 d' e3 L. C! E$ e% s1 T6 ~
  • ! X3 k/ i! ?1 Q

  • + j& a5 _- \( M/ D& i$ ?
  • , z: k* T6 ?. o/ p: @9 V1 I

  • 3 |) v3 U/ a8 P5 j

  • : m" R: s- n6 J5 u9 Y: `' a! s
  • + ?/ [0 j, B3 k# [: Q, d

  • " b. w+ S8 J. p3 C! v

  • 4 G, y! n0 Z& s3 Z/ R5 [9 p! t

  • * X# N7 R# I4 B! X" U* F
  • . m8 c& _1 E" }; w9 \9 _

  • * o/ w" s8 l& m

  • 0 g" w$ @5 U8 C7 a  Y/ L

  • + l+ M3 S& n0 S  C

  • 4 t$ j4 n. `* D. ?+ g$ U7 b
  • ; S. A/ [% d; S0 w6 K

  • + p( i' S( w; L. s+ X

  • " ?( z* U4 `4 Y6 y9 \) _5 W
  • 8 H' z1 p* i/ F4 p0 ~0 ]8 Y
  • ; o- Z5 v8 m; U2 ]
  • & \: g/ p6 n% f% W2 Y8 T4 w/ t
  • 4 W: r, G* v/ V4 E0 y
  • ) W( t; l3 F5 N. N. a7 @
  • . }9 }  W. T3 i! n" D

  • ) u, R! f0 T4 [/ a
  • ) v9 S' B/ I8 t% A; I

  • 1 F7 {( T( a+ l# C) ?
  • 0 t4 \- d% b; Q

  • 1 R9 m) s: i: K& f- T! N0 D
  • ! K/ F; Q# x1 s4 o* ^

  • ' M5 _% A8 B  S4 q+ l3 J9 R
  • ' e; t! A# h9 J4 }! i& f3 o  b

  • , H3 q9 x% ]9 ~: v8 Q

  • + G0 W8 P3 @) q; k7 `" B

  • 4 a- A# g) \/ S; k
  • 5 W" X; a; T9 W! y- b

  • " t$ }6 \- [1 b0 Y# f

  • " P- M5 x* {( s7 {/ O! i8 V
  • 0 \5 `' G" b' X" ?$ P* G0 ?

  • " X5 [9 }+ a+ ^1 ~; w# U3 o

  • & ]6 s+ p, J( \! R' b' K5 `# \3 N

  • ; p8 ~6 E  E1 ]
  • / A5 u% d/ R6 F' P

  • ' n' B4 v* f. l3 M( O. W4 I. q

  • 9 \8 E! n, F: @/ N/ Z6 x

  • ; m6 j. t$ t, m$ ^
  • . M. I" h8 T1 M: L+ e. M4 ?1 u' x

  • - M1 h- w  R' g7 O# [8 i8 z+ x
  • 5 J+ V7 r; U' P) \) F/ |/ F
  • , g4 n% Q" _0 i, e& [7 C4 j
    9 {# }( x8 R5 d- ?4 W: J' o

##绘制有海岸线的中国地图#引库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()
" R: ?0 f0 y2 E5 C- a) e9 H

$ o1 ]. F+ U6 i8 `' {' c7 g
5 _! p8 c6 p* ~0 O. ^2 S# p

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

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

28af454b4567839d9c888c0e3809708f.png


) r; Q! H) D) f7 i# l5 u

  • / c6 t- C2 B+ z7 I8 ~7 \  C
  • 1 V: |9 ?- v+ i6 k8 }
  • ; m# S& U( u, a- a$ J

  • 3 ]5 D. e7 n, y( ], y

  • 1 v$ P1 X$ H$ X/ r5 \* G& n% t

  • , J& A- \$ ]: i. A1 q$ B! ?$ J
  •   h& M- e9 }. `# E
  • " A/ \  A) r; z: C2 ^& x

  • ) H; P+ X5 q- K8 q
  • / H( ?& b8 T/ k8 ~% P
  • 8 \& @' R$ ^1 L' k

  • ' o, m- u+ j- m  l# V. x
  • ) j+ |" p0 z$ T0 R
  • 7 p/ j: Y; F' B
  • 4 C! Q* _+ c2 O' \- {8 }% w: C
  • 0 X1 d  x# z6 y

  • 3 w0 m9 v  w1 j  E0 n

  • 6 U0 i7 \: y3 S/ A5 j- P; c
  • % M8 @9 V, q  L8 L: h
  • / U( ?7 M+ a8 a2 x7 u
  • % R9 t+ f; G- f$ ~
  • 7 R5 {4 ?2 p. `" Y% R
  • ) Y, T5 O1 B( J. K
  • . |& h* y# x5 m. ?: j' I

  • 7 L" q5 Z& ?" ]1 C; P: c" F

  • - i! q5 K5 i" t! U1 a4 [/ f

  • & I! r. I; ?. Q/ _" ]1 `
  • 8 s7 C( P; y/ H8 c- Q! d) }) ?
  • 3 P* l; I7 x) h9 ^+ U" F

  • & _& m" @! k% e

  • 8 F* o  L' s1 c% ~' g: }
  • 3 z6 k) c. d& K$ M
  • ! _7 ]4 y  n7 N. T' o( @3 D& ^5 `
  • 7 y: ], f6 d+ _+ f# v( H& y( Z

  • ! M5 i: f; K( t: C2 y" q. m# V

  • & {7 B' ?8 w$ A$ E( E

  • ! r# @; \/ Y% I" Y1 y
  • 2 j0 k5 @# R7 Q' j
  • ( c) `/ }8 g7 j( N

  • # d! v9 w; I1 {2 M5 l! j" C
  • 8 E0 `, v7 x! L. ~2 ~! ~$ m
    , Y: Z" ~+ v* i

#例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))
% U9 k2 {1 w8 z( @/ }5 S

. j0 [7 i0 G9 q

' ^6 h; a. d+ P( Q$ G
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


# p$ J& d$ T& ^1 w6 m0 S
  • & z% R/ g1 w. u: `) W$ J+ Q+ e

  • 9 N% T. b3 K! ]1 M! @( v

  • 2 L1 h/ t2 U' V8 y& |) T! A2 T

  • * K2 w& J, l6 G1 [6 b, {

  • 4 |! c8 T0 ?! @/ [( Y. O
  • 6 \) U; G7 b6 R% {
  • ) @1 ~) d7 S* E: l: m# y! \
  • ' \6 }. A" @8 N
  • ) u! S$ F' A  e, }
  •   I) X3 d: b2 _2 o' {# X- }7 G

  • 0 x5 |" p( Y3 a) p7 S

  • 8 o3 w, K8 b+ T0 l$ B
  • - }+ N( p) J: R5 [

  • / C% y, K  F/ D/ ?" W

  • 1 J5 [/ o7 l4 V

  • 7 ]; |7 V" f% M1 ?! b* F/ i" P: l

  • 6 j! L4 U5 K" ?2 Y  O! |* p" H0 S

  • % n( G5 Q4 c% i3 @9 n0 z1 R
  • 6 k0 E! d7 K2 \: K, B% V8 J5 a; c

  • ( J( q6 H1 a7 g8 c( h
  • ' S+ \6 l2 M  }" R4 `' n
  • 6 b: d* s) r# h( F, j* |

  • ( P9 Q% A1 s7 W! T+ q

  • % {) D2 r6 F, H) B; Z$ d! f/ Z- v

  •   y, R( q% ?9 A2 ~2 D9 Q
  • 3 U+ p$ e% h3 [: j
  • * e6 I  c; e) }

  • + X5 X- S7 l3 j, R. [# M8 {
  • 4 o  P5 Y. M) Z, p
  • 5 r9 I( R# e+ }7 b7 b8 v" r1 Q) S
  • , t3 W; B7 v% p$ _$ K! |' j

  • / `$ H: e2 ~% Z: I9 L+ ?" |
  • 5 ?" W1 O$ _; s+ `5 g, l

  • ' i2 Q2 [7 J# y1 I. F
  • : j3 h8 z( k2 ^2 W7 v9 I6 [
  • ( |4 P7 j+ `/ ]6 a$ }  @0 W4 ?  d' z
  • % ?& [) H- O4 u  \

  • 1 H, h3 R6 A" R; a& i
  •   t! |) @' `, k# Y( j0 n# T9 f
    + M, _4 }% a* O, z- q' W2 S3 T

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))1 d  N" x- U8 k  \$ m3 m& @; M

* S0 h" r, r5 g5 b. ?

1 O$ H/ o& ?; I* f" a) r: W0 e

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

2 ~0 @& O+ n" s

2 k# l+ ^. G2 {  n& X6 v# a
回复

举报 使用道具

相关帖子

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