收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 d8 H' Y2 ^! _4 h  b# }

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

% W, F$ z% O  @3 `+ X
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • - q/ t: C% x$ \: I- M
  • . k: O2 \5 _4 ]- j0 f# F$ P

  • ! T  S- J7 [5 R7 l
  • ! [: ]) ?0 t5 A( `" x& U

  • % b8 i1 C: k. U
  • " n- a# K8 L8 ?( Z
  • 5 K- Y( C4 s3 i$ i& ^. u
  • 0 x  h+ u" A! M4 P) p& r1 ]9 W
  • 5 Q5 T: b2 [0 U7 O' o$ k
  • . n3 D6 ~" ]- L

  • + b! _0 V5 s# E5 ^

  • 8 e" s+ T; g+ }% d, U/ g- P- X

  • 4 |: i7 N3 X4 R5 ^5 C7 x

  • - h, J7 \% X  W0 ]
  • $ ]" X5 G2 u6 q. R: y
  • # p% F5 |5 X; Q/ K$ t6 Y
  • , R$ t6 f4 W' s0 [, k: c

  • * g: F$ g9 D8 ?7 X; W

  • & ~  T7 b$ V0 I# m. `. N  e
  • " s2 X# k' x1 }+ W1 Z/ I
  • ) e+ g8 D/ v; q
  • 4 b' Z0 I$ `# K+ S5 ~

  • " ^4 h3 {* n' |+ a5 l

  • : @. K' x/ n$ k4 R( u
  • 5 R8 i4 O/ K7 ?& w0 L' U6 z

    2 \5 v+ L6 X+ s2 f

#绘制中国区域基本地图轮廓,包含省界#引库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")
, K, `1 c9 G9 `: r3 }

' q$ }0 a% R) p( W
9 x0 r0 G, ]: V9 J3 H, R& {6 j

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

- k: e. }$ B2 P  S' L
  • ! n4 ]% q. V1 u' x" Q% \% I

  • 6 A" L  `& x) N9 X% n
  • " g" R: x  @" P3 _+ T( D) M4 I7 P

  • 5 k6 g. `( g9 Y

  • $ n* X$ q3 l) h% a) Y" i2 r1 V
  • 9 S4 ?$ `' h! |( ~3 r8 b

  • % j# [+ u6 P# v$ j" B8 U: r2 M+ Y

  • 6 y, i; L* @+ y2 b# R, H
  • ! x/ v. `% ~* m6 `" H' q

  • # ~" s3 d$ D/ L0 w

  • $ Z& u/ Z. a) L4 q

  • - `3 j4 m5 o" \9 [, J
  • 5 j5 K9 S8 m$ S) H9 Z& h4 h

  • 6 P3 M. ^/ S' V- c8 H6 V. N: y6 I
  • % M: u- {/ T) U

  • / l; N& s0 b) G3 q) T
  • 9 G2 J) ?5 w) C  Y
  • 6 ^# ]/ r& e: P) H

    * l7 z, ^6 ?4 g" S) g% V. 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")
& g. z2 g; ^* Y7 Y: Z& I; S* }

, v% o( G, p0 }( W) i+ [$ u: d; ?. ?

  G: e, r* B( X; ]

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

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

f5c3384582002193c2c6c354a3d26729.png


+ X, J  K( q6 [. g8 t8 d

  • 3 G, }' \: p$ a' Q$ {

  • % W: H8 |  ?4 A2 H. q
  • 0 t1 n; B7 a+ z8 V$ F

  • 9 @4 k# w2 D" ~

  • 9 ]4 e4 A' }$ q* j9 S6 |
  • 5 T7 D5 X; T2 ^; G( l" @4 J0 u; q, K
  • : t9 R: U2 `6 \- q* c, J3 w% q

  • ' j" |# f3 r" Q- l: T

  • ) `  Z' }% h3 M, k6 w8 l

  • * f' R# J1 D+ ?1 Y  p7 N$ {1 ?9 [, j2 d

  • 5 F* K6 H# z! U8 F& Y- c6 Y* F2 C
  • # Q/ ^: @; ~$ R! T' c  r6 A: h
  • : i- i8 w! s' p, T6 E$ ^" n
  • 3 z, a; v/ N2 j- T% u7 e' S
  • & X$ T" j5 y$ B, B& C+ U4 o% f- [

  • 8 B3 @: b9 z. @9 {  w

  • / q5 O3 `" r: S+ n3 L# R! t

  • ; d# X' g6 S, M7 b- U9 e. t0 G

  • " L" X3 L$ w+ ?& x2 x% A1 g0 A' {

  • # S3 g' U  c" b8 r6 {8 p! q8 z

  • # g( U5 e3 f- p/ h. y: \

  • 8 I3 L( g/ A1 |( z

  • 5 K7 X& l! K* i7 s* {7 F  R; k0 k' n

  • $ l- O/ U. X% N+ N9 e& e" e
  • 6 O8 x: k0 u0 ^  G4 ]3 M& b

  • : h: s8 X+ y+ N+ X) _' q: b+ q

  • + y; X, ?, ]4 l$ F: W) ^4 I+ K8 p

  • 2 ^* b7 O4 R$ P' L/ E9 s( e3 E

  • & B5 W( m- I8 N7 _, O

  • $ k* ~, g6 [3 S+ I. I5 S$ k, ~
  • + u0 o) G' o  d6 B

  • 5 C0 R- t) H# @% Q9 ]% u
  • * k% O6 K! z, H4 G2 f. \) A

  • 8 H$ \$ U$ e( E7 v, \& l5 A
  • ; C# j7 |6 b4 b# F- V: w

  • & K- ^) D( v1 }/ S( j2 _

  • - |+ d5 O, @  X0 \) d5 z

  • ' }: X! Q, l% N7 n, V& v

  • % f" I5 ~% N5 N. X; u! I
  • ! {0 G! p( f/ m6 d- H5 `
  • & T9 Z. [( r9 I  E
  • ' Y5 k1 X' X( N) z$ L

  • 0 N* T  C# N5 ^: ]

  • , Y, a* D: e9 ~
  • % Z# X8 r" o; P( x7 a
  • ) f& |. E& G% \7 E/ f

  • % S! L1 c2 h1 Y: o

  • % u2 ?- Z, k& f: ~3 m
  • # a( R0 D- ^. a# y7 p6 Q5 `

  • : b) L# d- t; n

  • : d6 k3 a0 i7 L9 n$ }9 d2 f2 T- ]  F
    $ N2 S5 X, r! |4 _

##绘制有海岸线的中国地图#引库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()" l5 L" B. _- b1 Q6 P% w6 j/ Z

4 ^; }3 ~7 E0 f5 t+ w4 n

6 X8 H% p6 j: ?6 E9 R& Y

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

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

28af454b4567839d9c888c0e3809708f.png


6 ]8 ?$ Z) D' p/ F" I
  • . D3 P4 G3 \; O3 J% K

  • 6 w) }8 n' N0 W

  • 3 i, T6 f; K9 b9 x, {  g

  • 5 \/ n% v8 m) K) k) ?

  • 6 t% `( W, q2 n% [) M

  •   N: `: q% U0 @4 i6 r3 s

  • 8 `2 ]3 n$ Q2 Z  g$ \9 P

  • 0 ^6 |3 I& J4 W9 z% L* ~
  • ' R# ^; d; ]" `

  • ( r, O9 R& _0 h4 M& r9 e' s+ \6 {
  • : p. k3 g" \3 b- g5 Q7 p% U
  • " g+ A* g! {* [5 ^! K3 B! G( s

  • 9 J+ o3 [/ n3 @  v8 |2 |0 t6 N
  • 1 @! F3 }& L! c( `

  •   ?: n; `# Z" k' l# F! f" ?9 [
  • : ]# f$ Y3 z  b; k+ g9 u. }* j

  • 9 U4 v6 J4 c9 f, x3 A) W  s& }

  • 2 u: P# S, C/ b9 U5 h
  • 3 P( t3 e+ v, t3 W
  • 6 M0 h+ V# l6 b; R6 j/ Q0 Y9 q
  • 8 H! x8 c1 V& i5 K( S' [
  • ! D" E& a; h3 C9 f( J2 Y
  • * r2 R% x7 A+ v2 G- E
  • 5 O0 L1 k9 c, w. d- A% v! @
  • 8 M, W  l$ Q0 C" g# a+ v
  •   V1 ^/ S/ A& m* ?+ A
  • ' _% Y- @7 K% V- j! `) P( J
  • : F3 J* n4 k3 x
  • " ~' s; l5 ]9 c) Y0 J
  • + a. J( K4 L9 v5 J3 z! [2 P6 {

  • 6 f( O$ D+ p4 b5 `
  • 3 q" {( B" y$ i7 ]! q9 l* `8 c) a
  • / @0 V) ]- @! H/ S' p# @3 B1 v, Q

  • : a5 V2 @7 b' k3 H5 d1 F$ u

  • 7 u* F- J+ z9 C+ i, k
  • 8 B' B/ U1 m8 j# B0 R  _

  • & H" l7 V9 Y  M, ~1 A

  • ) [6 _0 H  b; J. [
  • 4 l( f. |) s7 V* J) V% g9 d
  • - C# b, l# f8 ~' n9 v" S( \

  • 7 S0 I2 T' ^) ~2 {1 g" S% |  B7 I5 F) b7 \! J& M$ Y$ f3 \

#例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))
* D+ t6 v# w) K9 y5 C5 u2 V" w9 Y


: S, X4 O4 S3 K


& R" Z/ b9 T9 r6 G/ ?- ]+ J                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


7 ~3 J2 ]" n) P0 u
  • 1 s) ]% _. Y- M: l7 R# W, l/ G

  • # l! x2 k8 ^) m3 D7 ?/ q6 \

  • ! [* F0 e7 `) U! c& X; e  H
  • , J1 B! P% K0 H; P9 M

  • : Q% s' _, [  w, O! n" p+ d

  • 0 [7 a: {1 [: T
  • 9 w; \$ t7 e4 ^/ B8 t
  • 4 P. ]  X) Z8 i1 @. M3 D7 f* o

  •   `- G, F* a% m% Z3 m% b

  • & C, j( S7 ^* U
  • 8 L5 O4 C7 {+ a  [

  • $ E3 B3 K0 c  U! n
  • 0 M+ F( v4 ~/ P; U
  • 0 q0 W+ V# X8 M" w9 g' l; m& _

  • 2 J( q5 p2 q/ N5 g3 \7 R/ r
  • * d4 W- p* }/ U& n" x0 i, Y

  • 7 J2 L6 V. U0 h; z, ~# H2 T

  • / ~; `/ Z" t. O1 [+ L: \
  • 7 S" P0 H* K0 t. h
  • : b9 e' v6 Q2 I* g1 R* V# T8 {
  • ( E/ l) s0 u' G- t
  • - r5 C0 `& [6 U- q6 f/ H
  • 5 e0 U& b- T5 {4 E# N' p0 Y
  • 0 O4 L6 C, o* Y/ q* X8 ~+ j
  • ' q4 c! e! Z; \$ L9 W9 h" h

  • ( u, k0 J: j% d) C6 ~: ~

  • 3 f3 r# \0 Z3 D* ^1 c
  • - H$ M- F% J2 n
  • 8 ~; o- y6 s9 `* j) T& f4 v3 W) R
  • * i+ [% `- c( r' ^. J

  • * }% C! r! U! j6 H' c

  • ) }; Z1 L4 r& ~! J

  • - \6 W; N; T7 I& i" T3 ]

  • 4 Z; h% I; ^! q& r, O
  • & F/ D" F% Q3 Z- o

  • 6 F5 s( A0 J, L2 O' u  l
  • 8 K6 Y) W1 e3 e' B! r
  • 1 T* Z2 T" ]  [( N5 ~

  • 5 ]4 w9 l, b) Z: {' M/ d  r* M* W1 E: [! D4 R- M

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))
' H* J1 Q3 Q# B/ ^

, S  l/ U6 f& {7 J8 t6 f
0 t* T- P- e  x# w- Y0 N

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


$ `' ~* \( A6 Y3 |& f$ @  y0 R- \; a% ~2 d
回复

举报 使用道具

相关帖子

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