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

    4 \( Y. q3 d/ \( F7 k3 ?

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


5 i/ ~5 q/ Q0 H0 d1 x: G& M1 I                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • / S; D' `3 R( p, _" W2 E

  • 7 f+ l5 t" j; D

  • 8 c* T2 k0 T4 H, l' Q9 }

  • 1 F" b, I' B1 u8 s

  • , `6 k' x  G6 o6 ~: e( K: L" H

  •   q4 v* h& q5 N, c/ r: S
  • ; L' X1 x+ S& l. n% P+ {" H% L3 f

  • 9 _! ~6 }' J7 r
  • ! U/ u8 z. g* E: X/ _
  • ; I; D3 ?+ y6 l9 Z# r$ F
  • + c% f: T: b( W: T- Y9 b* u) [

  • ; w# V# `6 B) A+ ~6 c# u  \
  • & [! B$ H3 U/ ?4 M9 G5 S7 q- ^7 |0 ~

  • " C4 J8 t: z5 ~' `

  • / w( ]! q& g# z* B8 _
  • 9 f, ~: U- I: s; u: ?& q" ^; I" L
  • ) m0 }& x* x! {# n6 S+ {! }
  • $ ]* T  W6 R  ~4 u4 P; G

  • ( X9 Z3 t) ]$ B6 q
  • , c$ c  }7 |) b2 F. h5 y4 c6 ~
  • 8 G- A: _% |3 ~: P, L
  • , D/ A& f2 `1 d. R

  • 7 D5 x' J' p* H" E. Y5 M/ F

  • 6 t7 F( f, h# F

  • 0 v- i2 t! j, v% z2 i% `; l% ~; ?+ Q- {' q' q

#绘制中国区域基本地图轮廓,包含省界#引库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")7 v5 {$ U) |0 a( n

% z% {. f) a7 `  W

) _, Y7 s% r5 ~

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


4 L# @4 _, b- L3 q9 b  I0 `
  • ! `/ ?( a9 q; A! i
  • 3 K/ T  J6 H& ?) Y
  •   k2 _# r' d7 E
  • * \/ }, |. M2 n" w& r! k- x6 t
  • 0 t- r8 D2 w9 }% v2 w: H% L7 O6 Z, f" q
  • ' G8 I/ s6 W1 A! i. M! _( d9 z
  • 9 v) [, r( B! f
  • - [  e* k: N- O: t

  • ; q8 l6 d9 ~& U! M

  • 8 Q) J- d$ G  O

  • ' L; m! u' @/ p. y! p

  • + q# O" e: n3 e' q
  • / i% s0 s7 @5 O; x; N0 p$ ~
  • 5 |0 B/ c" R' B4 L5 x

  • 0 L, i  `6 K7 G9 n# S; h9 d/ ?$ `7 @
  • 6 T% R. z4 p, T9 [) s; |

  • 8 m0 V2 f. j) |* @; _# a) c) J
  • ! P1 ^. [" K; k: S- M* x
    # g2 x& v8 D4 e% j

#绘制中国地图,并标记各省会城市名#引库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")2 V$ r# G0 B7 c' a. ~2 \, ?$ r

/ @; ?9 J3 n. }6 Y- U& M

8 q4 u" e1 D) w! g2 _

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

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

f5c3384582002193c2c6c354a3d26729.png


1 N1 q+ h) f1 @
  • ; c+ Q7 d3 V/ G" B5 }" v/ n% _* k
  • - [7 B: A" o( G3 T

  • # D. ~1 |  E7 G* u" [! y4 J

  • 7 _, v# \+ V4 N7 y
  • , A) G9 }0 u: @( w9 P6 b4 P

  • 1 f) c  p9 v8 \3 @/ P4 T, n. R! `

  • * T  C& Y9 I/ h  o& E' U

  • : j$ x( Z6 M2 t1 h7 K
  • * U$ B, Q, O6 p, C; Y* N6 ]
  • 0 K. R0 Y. e( j

  • % n( r$ B7 |* a$ N- b: Z
  • 4 e! H3 S2 K- v4 D* L8 `/ k. P( ~
  • 7 B! m1 {& Z0 |" M- R

  • % c# y1 ?" L+ M; E3 z* `% n

  • ! p3 _5 h( N) b* D8 U: ]

  •   o' r4 O; v9 I" @6 N  P% R
  • - t3 Y6 X5 g/ s( L% w, N1 o' x

  • 3 G' k# |* l8 T

  • 0 b! [& j2 ?# Z0 V! x; X* Z% u
  • $ [- n5 \! F0 l9 I  K

  • 9 d+ A4 L- W5 ]

  • : ^/ N! W. c6 J5 J2 i0 _9 E

  • $ \5 X. }5 d* A
  • ( Q7 }. P$ W; T# K3 i  ~6 n

  • ( k6 A/ s; T% ^1 l4 r
  • ( r$ Z$ u  S# D+ {

  • ' @( }! r; r! T! E1 F0 z
  • ) f6 X7 A2 H4 l3 {- ~' T

  • ! H! }. ^' V; I& {6 P
  • # R) _3 S$ l* O+ F6 n

  • - D- m8 I, ?8 ~$ a* N, L! ~+ l& v/ g4 S
  • 2 L$ R* J+ ?: ]& c7 Y
  • / h3 Q9 |: U+ b9 }

  • 0 a0 @' R( g, h% m9 m
  • ) n0 ^( ^! I8 E/ Z! a- i
  • ; L7 n; v6 g: ~1 y

  • 3 w* ?! v1 K$ U

  • . A6 m4 ]. |5 z$ `' d3 X, h8 S% D
  • : D; F/ W  |/ Z5 A0 ]. x% e
  • 9 m0 R( f5 N; @5 ~9 t# e) c
  • 7 Q8 M0 S' u7 A; B; m9 R9 r6 B

  • ; _3 D' k' K; z8 P4 M* V- @% J

  • 5 T2 X3 e7 |+ G& l9 U* Z" u1 _  Q
  • 1 W4 o  N) O7 Y2 y+ C; O
  • ' c. J! K7 L( O( a# l
  • . z; w5 @8 v" k* M3 S9 e; y: ?

  • + `2 [( h2 Y/ x% p

  • " {* M1 T- G5 F1 c  ?( v- ^3 B. E
  • ( O8 W6 ^/ ?+ {! N$ Q1 [) m

  • # Y" v) v% @- ?; i
  • & ?7 O& v  s# A: \* N+ v5 w

    1 B& O2 ]6 S' J0 f& k

##绘制有海岸线的中国地图#引库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()* z1 P  ~7 S$ R" S5 Q

; E! n/ J% P& Y: }
6 w9 x% Y4 Z  R* o2 u& Y2 f

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

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

28af454b4567839d9c888c0e3809708f.png

9 Q: H/ h/ t; Z0 q. ^
  • % I8 \+ A' x1 L5 x3 H; Z

  • ! V* k6 v( V7 C( Q. W9 H7 m
  • . b& ?. Z' Z- R6 R, G% Y( e5 o
  • " o- N0 I8 Q) P  s; _

  • 9 |! p- L4 }/ N# ?9 }

  • 4 _7 H4 c* w- {

  • 6 r/ D" b1 F2 c* O+ c" V" }. O$ X

  • 8 z; f8 x) q. \9 O. d0 D2 K! f8 }
  • % Z. s/ o8 W6 g

  • # G! d: A3 t. j5 a( A" O

  • - g7 r. m* j* I5 ~$ c, x* O
  • & i8 J( c! {: [
  • 3 P3 m" O5 o. e3 o& {# q

  • ' |9 G& s# F6 F: i+ h+ G/ X5 N0 E
  • 3 e" Z9 A; n6 E+ k3 U3 x3 D

  • * P& v; c( B9 E; C/ i0 c  {7 E

  • - q- p9 D* G8 t2 \' i" {
  • " S4 G! V5 D( k( M% U" N" r

  • ! w! ]. v* Y5 T* i) H
  • , P2 u2 |6 x# t8 R4 A# f1 k0 L+ y

  • 3 M; J: `1 K: E9 |5 Q7 O
  • ; f) \1 x; |7 E' i
  • / {$ X' ]; R5 n6 R6 d

  • 2 z% O* S7 O+ _' J  N8 C

  • * W0 u$ G' P# a! M& G8 k
  • ) b! T- ~6 e- _

  • 0 |9 l/ _- R, b
  • : @6 E/ U4 ?! _9 N

  • . @) o$ l( [0 W1 ]& R

  • ! r% j( F" y6 Y9 i

  • - B0 v& J& l' [
  • # c/ Q# M5 T2 D* D
  • 5 |0 f6 Q% n8 [6 ]$ x

  • 9 k3 q, D0 u6 W/ c
  • : Q# P% r/ Q& w& X- h
  • ( ?  V" T+ u; ?0 D! C2 L4 a

  • & d1 ^. P5 }. H- u7 E4 ~; l

  • & y, y( ~9 N7 q4 J; N; s
  • 2 F3 D+ ?5 N" c9 ]

  • % O* ?2 Z! f/ d

  • + [: V. V# Z( q) o3 j( _! H/ H: A* v* Z2 y6 A0 L, e6 R$ C

#例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)), ?6 C) O% Z' F. [8 }


* @/ H6 }" m/ D% f0 U0 I


9 n. t2 E0 ~3 Q                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


/ S4 y* o4 N8 J, M2 r

  • : y# c7 ~# B. b$ {4 @

  • & g8 y) ^! J- ], |
  • 0 S: @9 O6 R2 Z

  • 9 i! Z7 L' I" h( z! ?1 Y# n
  • & o. t" n- U' K6 {/ \: b

  • 9 N" `! R! P. i
  • ; o( L: [" e6 q: k& q
  • ! N& |- {7 j( {5 O+ b6 U* f

  • ! |/ q, ]0 y; u' `5 e1 H8 n
  • . g; Z5 C& j7 L& u8 P! v; r+ L
  • , w0 ^! o  m7 {6 m2 B
  • 7 n: B4 g; I8 k+ `+ l
  •   c, i1 |5 L1 ~$ O! L$ \4 H( b

  • 7 x) H  @. s  D; [/ [
  • ! z/ I& ]+ W) K! M: w1 `' z) E

  • : D0 z8 b% D: ?# r+ a0 T: [
  • & x8 ?5 g! L5 K' S  d* S

  • ( y. L6 {' Z2 _2 _( m

  • % a9 c, q& Y) }$ I' f, r% Z

  • . F& p  e0 @- x3 p( A
  • 6 |9 V- J) r6 F" s3 [/ K6 S0 Z& e
  • * k, K+ q5 h& U. ?* _0 r( c. u

  • " F  }$ n: f2 I, _: p  m, K
  • 6 t" R+ t7 ?! x$ E0 H
  • 5 g5 Q# A( e+ e/ T* F

  • 7 k, h7 T  w( j2 N/ D- E
  • " G) \: \3 c, t% q& b
  • & C. i) j0 [9 C9 k4 H( r
  • ; F* S4 q, E: W# {

  • 6 Y& D' W- q, F0 j& m% a$ D- F

  • 3 r6 d# {, H  J% x  j& Q4 G/ g, G

  • & `, X0 }: |  r2 _7 [
  • / h/ A4 U+ O% j1 @
  • . z( e$ W& g* V( R* v1 Y

  • 2 t* z& Z* r) D; r5 B. j

  • ) u3 D# k$ W% s8 F% t7 m8 \
  • ) h. v" J) a# W5 O. x
  • # v0 o  s' {7 K# m

  • ( v5 b7 ~3 H1 Q  R- ?' l0 T" M0 q. |4 C

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))
( k. f( v- u6 l' P


; f) B0 X& U: Z+ }: T
- U0 C5 x, F: z: a7 r

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


4 B* H$ k' Z6 y& h! \4 |9 T5 w- H: V! K( ~0 v" T+ E' s. y
回复

举报 使用道具

相关帖子

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