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

    * P) m% V6 k8 }% }% Q# q" R% C$ d

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


% }8 _: F- l4 F, Y, |2 {; e4 |1 |                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • ) i, f/ ^: l; O
  • 0 @& I, x6 }3 }7 b6 i$ J
  • ' y8 \# v( W/ F- c( j5 X

  •   Q; `# y; D( t
  • 9 [4 i5 C  P6 N0 z% c4 K7 j
  • ( M  v" k1 A( N7 N; Z

  • ! l# y" ^- h' h- r. }/ V

  • - t4 t- C2 f+ O1 j6 P  K# q3 t: K& {

  • & j$ V: `% w; E, x# M
  • . f8 h: W# d& x0 m% D6 X

  • & O3 L0 d+ m/ u

  • 2 @+ _4 |2 x4 `5 L9 T' P  l% b+ s- u

  • 2 O- I8 G& k1 s! C
  • : K) a0 u4 `4 N
  • 6 \0 W! p1 w! K' S# f
  • $ h( G/ v( x' T! W+ |9 P% P6 Y  P

  • 7 O1 }! U/ E8 P' ?7 K( I0 V" i2 E

  • " {. ^* ^( m) E

  • 2 g2 P/ `6 b7 w, C8 v0 D" {

  • " J# ]% y7 n4 T. ~, O3 w3 X. U
  • , }7 s% v$ M% g7 F) J8 i

  • 2 p4 H, n: ]) h- s9 S  u' V

  • % g# [$ p# v& j+ ^" E8 d3 L

  • % J! r' o4 v" c2 l, U" @

  • * v$ R4 ]$ _& o" Q) @6 i4 q" |! f
    4 T: Y* P. \7 B$ ]: \; I0 `# g4 q4 y

#绘制中国区域基本地图轮廓,包含省界#引库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")
* m% ], v1 N7 [& w$ e


' t# `9 Y- Z' X. O+ j) q( f7 S  P3 b0 r+ x9 p/ d

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


9 K% E4 E" r6 A0 T) F4 R$ h

  • & b5 ~! ~8 w" s! c' h/ |* T
  • / F( N" S( R. |/ X6 g6 s
  • ) f2 c6 H" B9 F" P5 K8 T, t
  • ) A0 q' f$ H0 L7 R
  •   D6 m5 ]8 V  i
  • / H. Z& S3 H  y0 a, M8 D7 C
  • : L4 G% ]) n* g  @9 e* ]# H
  • 4 n4 d- @3 D5 n: Q

  • * l$ [8 Q. m3 b
  • 0 T4 U( L6 W- _1 D0 Y

  • + a, [: s0 Y$ Z+ R! @" u0 T

  • ' _$ H; V. i' ]8 F' ]

  • " L- K- Z0 H# j( e. y

  • 6 _1 G: \5 B$ I. \
  • 4 a) R4 b/ ]4 t8 D0 \
  • * r2 O# r: L- U1 b- T
  • " a, a1 z* H; s  F
  • / o% r8 z/ _/ Z, \* H& }7 w; {' |

    , E1 V0 U3 g) L) g  x) v5 y% 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")9 l& d0 n5 x3 e! d8 c+ ]

' s2 l9 n% ]# U1 G% m
) D( v, ?5 n0 j: m6 q

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

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

f5c3384582002193c2c6c354a3d26729.png


5 l! M; k8 n- w- b  R' L$ C
  • ' K& O6 [5 s8 k3 C2 k  f3 m% ^
  • 8 n( m) @# y; L9 h' G5 w9 R8 C
  • # t+ Q& n( L! B2 h

  • # t* f; \& {0 s8 {
  • 2 O9 g0 ]6 J+ ~, i
  • " N- f5 c. Y3 k
  • + f$ X  _' n0 ~4 R. a
  • 4 M# O# C1 g" C1 B9 o: G

  • 6 Z) _' |& s! H  U' ^

  • & h: P: E* J! x+ O) c
  • ( l" z; V/ I" y4 d) z( J: _7 k

  • , K3 l4 Y; [+ V8 A, ^% g

  • 5 Q- z2 \3 _* q  Z% V% I

  • ; L7 J  b8 ~; w, U: B" G$ D
  • ; A2 g2 ?% {6 _9 n7 B$ H4 V+ _
  • / _: E$ N" W: j5 [. a( y" ~

  • - s- o  p: p! h- u# n/ e
  •   o- S7 v( S' d, r8 }/ i, U1 d
  • 5 p% V7 M* N" [  O$ {& a

  • 1 O: @2 p4 ~" n8 Q7 B0 c

  • ; F' g6 W4 |" X# L# m$ g2 m: a
  • 9 O& I* G0 A3 @! L  M$ X

  • - r4 t5 {& U; A) Q5 Y2 u/ Z1 e. q

  • 0 I( I) g7 @* E" V, s- a: |- g
  • ( T* i: h" S' n
  •   f; v5 A7 m/ Y, d- j  l8 E* G0 |: D

  • * {) g! N2 S3 Z& G' ?5 z: l
  • 1 B2 J3 D! \5 B; ?, w! P/ j1 w

  • . E) L' ?* L$ `! F4 W

  • + H) ?5 O1 a% a* p8 ^
  • 7 x! {# w. {+ _& Q
  • ' Q1 o. o% r8 h; R- i3 B2 l

  • $ N: M3 t& B4 A3 r5 a! H

  • / ~- O& y( W0 C' Z# {3 T

  • 8 m! Y- w/ e% E1 c" @/ ]/ i/ ^5 a

  • % c' {* b% T1 Y* D3 d. z8 L: C; h. E( ]. r

  • # G# T1 ^! K8 D# k
  • & v. H6 I! q6 U7 p
  • : ^! V; A! T1 o' d5 M7 @# j$ F3 ]
  • 9 \4 o3 w5 I& j8 k" x. r; E. ~9 o: \

  • ( u. s; Y; n! a/ y
  • - Z: }0 {) W/ r8 }: W

  • . t0 O0 i% M$ l0 C" C9 w% O

  • 5 k, U8 P# P  @+ G( y$ E% ^
  • % O3 I$ u% r1 i% G! e
  • 2 R& P, j$ ~2 G  U
  • * V* C" N# l3 c" Y0 A+ ]

  • / f% t) Z- e5 O( L* X7 j, p

  • ) Y$ x- V, M9 W1 h2 ]( b3 _

  • / R7 \4 y3 @: ]3 F7 D+ C3 E
  • 9 S5 h4 F( m7 y1 H2 C1 h, g

    ( F3 B- F* n( ?' {/ B2 t: u

##绘制有海岸线的中国地图#引库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()
$ u+ g4 }  P+ l* V. j' j2 X


* v/ S& Y+ P8 S( d4 L
: `, y' l5 o3 q# T

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

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

28af454b4567839d9c888c0e3809708f.png

! ~) S6 F: p! {/ q

  •   `  Y' C  [* s9 b/ u# n) D0 b; K
  • % g' I2 v+ a0 F# I$ C
  • * J! J! T0 ?( F9 _8 }9 u
  • , R3 S; Y, c" m
  • 2 ?5 x1 L8 J3 Y8 {0 P5 U

  • % P4 U' q5 l2 J1 r. O: @4 u- y
  • 7 C$ X, W  |4 l) ?( N
  • 3 j/ v0 @1 w6 M" ^

  • 8 l5 z& S8 Y9 R
  • 4 w7 I/ f2 u- M

  • 6 N5 \2 W( N; F

  •   J  l4 E% |7 m+ H5 N
  • ) Q$ b/ L( g- b0 }9 w
  •   A  k! ?5 M! _" t

  • % f' Q/ q3 _( C" p: \
  • 8 H; _- H) [6 f' p
  • 1 l4 E: t- B0 v, b

  • $ _1 m8 ]0 B( c, N. Q6 R8 X

  • 9 E- X) }4 ?% {6 l/ F5 |5 y) I4 i; `

  • " ?- I) v0 X! m  |

  • " d& J) j' _7 W7 r0 Z
  • ' y5 m% b4 v  X' q$ I

  • ' w4 C/ ?1 N9 S* X9 w. H; `
  • $ @8 U8 G! t& O# x; s. f+ I

  • 6 h$ v# v. j: j! P; {5 y3 ]
  • . z* L& d. B( r. ]* s) W

  • 2 G: Q% y2 u$ n

  • 1 `5 B: N( L3 ~! I- S# W
  • 2 A& A8 S" U- Z" Y  n) d; v
  • 8 g0 I& ^, e' e6 V

  • + z$ I/ R4 i7 |% l0 y9 N. t
  • 8 F8 V$ H0 X! q# c
  • 7 _1 R" n- l8 z# J8 _3 d
  • * c7 u7 \* {; p3 I' X
  • - `7 S) w3 D: A3 o6 `

  • # E2 v4 C' K, f) c8 z

  • " B- e& N! h2 _5 F& t- R" W
  • $ F; f% k* k! i( l, V/ O

  • 3 f* V- a4 ]' w" s" z
  • # q* o. z! }4 P/ p+ m# W* [+ ?+ K

  • % b9 [  d, R( \7 e" J
    6 _' F8 E) c( x+ ^3 f' V

#例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))) t: P6 S+ I+ U+ X; l4 e

4 d0 F5 W, K$ \2 v0 x


  ^& A1 v" ]/ z: x& {( w                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


3 O% q7 n9 n1 T
  • $ N5 ^2 n' k/ y9 x7 A

  • 8 R; Z* M9 Z+ G  T7 y( [
  • ( W: I' h3 s$ X& _. T- X# H  b6 u# ?
  • % P& p, f# G, o

  •   @2 e) i6 u  E% J8 U; R

  • 5 y' ^! v- f* W

  • ) R! k1 V' e4 K$ D: P  l
  • 6 }" w6 b! G4 L! J
  • ' k( o: q" g1 @& G5 ^

  • : s0 l7 @+ @+ o1 ~/ N9 n/ x
  • ( Z  f. y; ^' \$ q/ [
  • & x. n6 o3 Z2 W3 S

  • " k' \! w5 r3 v( t5 ]1 y( z8 i
  • ' {8 X6 @% `: f+ f; s. l9 [

  • : p' J- B3 o% M! M2 g+ M# d
  • 9 |5 s& O, X# h+ {. Y$ {  m; W* ^) v

  • 5 |: @9 D" M+ i' g' N9 _% G
  • 0 I5 v- [$ i  l0 v) V7 R

  • , ~6 y- D  s2 F$ J

  • 9 U, g! W; ]0 t$ K+ d8 e0 H

  • * M+ z5 O& F$ P

  • : _* k5 a, P: k+ N& P
  • % {$ I5 b# `" c6 U5 R5 o; P  L

  • $ _# r2 y& v) B, g% D- i) n1 q4 f

  • - {" P' m4 S# B! ?2 |# B2 U3 t9 j
  • . H* z7 r' ^! i7 ]" e/ r. V7 u

  • # z9 u9 z2 B0 F: f, A- k0 a

  • 9 d7 Y9 r; ]$ G: V" z

  • 4 g6 n& W- w* a. \$ d  n

  • ) }0 M9 m1 {; ^2 D6 ]
  • 6 E/ R) q) ]" U2 P% ~6 d; G

  • " H+ ~( _4 u9 r% f

  • * |8 B; x: j1 f4 l! c5 |/ s4 l. |
  • ( J0 g: I3 m  {

  • - i1 Q" j3 p- x! |# c
  • 2 }/ F3 ], a% `0 Y5 ^4 p
  • 7 y, f0 p* z. f3 J
  • ! h& o/ j9 n& H! s1 A
  • . [0 l/ v8 ]4 ?) ], A/ l

    9 V$ C  T% C8 B! R& b  E- {

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))
7 T  a3 ^, S: c. P& T* A( S8 ^4 t


6 s& Y$ v8 m9 v2 a  r' T
- n  T2 A, }' d$ K/ m& m2 w

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


* ?* X6 z$ E, K5 y; G% `  v  t. _8 P( {# d- f$ s+ p
回复

举报 使用道具

相关帖子

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