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


    8 ]. c  I! L2 d1 Y6 Q1 q/ [

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

  `& R2 j4 Z5 }- b( r
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • 0 [, E/ }$ r/ {7 G' G, x' A

  •   {, Q2 r/ v6 m; ~6 i7 o. a) c, {
  • ( h7 B% `& r' H3 i, f0 Y

  • 8 l* r# Z8 u4 B  M) M5 o
  • % B: h9 [# i4 A' T' ^
  • 8 d( r! R/ D( d* i9 t  c4 p

  • 0 b2 X% E; b6 e( n
  • 3 `8 `+ P# i9 g9 G

  • ( U; Q/ @& m& l* ^2 w% G- O* q

  • ; i. R( X! H/ X  ]+ h6 T; P

  • ! }& i0 r, y4 d! x" S7 Z  Q

  • / S& Z7 L) c$ M+ e" Q
  • * g6 s# Q/ i! y0 e- M/ `& A
  • + v: ]3 a% S+ g0 Q4 h% g
  • : G% v; s& X  o9 u0 T6 [% o

  • & J, Z: u  V0 {( n  ~1 |3 a

  • 1 C& @6 p* a" p+ Y0 @0 z8 o
  • . u3 b3 c6 _# }3 l) T* B
  • , y0 ^  Q, j5 v0 h% @; s) K" x; D
  • 6 m. h: y; T& V! ~9 e2 w8 W
  •   G- N7 y) q4 ^+ @

  • / H3 i6 p: c6 y; \$ T/ B
  • % a9 o9 H( N" Q$ [7 p* H1 O

  • + z: [9 q, n6 Y: r

  • 7 ^, _. Z  E2 N# a- f( f) z6 k, P7 ~8 X2 z. x3 }6 ^9 ~

#绘制中国区域基本地图轮廓,包含省界#引库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")- S3 [+ n" f  S  @: D8 ?6 k8 F


; U4 p5 V! ~& g, E- `5 f$ m/ c7 K3 n1 k7 n

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

: \9 w5 f3 i0 v( f- e7 h

  • 9 l: P7 T) r" k& H7 x
  • 9 K$ {. A4 b$ e9 k

  • / x* f* l: z4 F: E' _. a2 G7 G

  • # V) G" @# w8 h6 F1 j) r

  • ' h* }  M0 B- t8 u
  • ) B3 d! V/ R- K1 z+ S) B
  • + Z& X6 l+ B/ W" t3 ^1 Q, g+ P; @' T0 o

  • 8 ^2 o/ x2 z  U/ J' T
  • % L- }' T3 W3 _  m) V: W1 Z. \

  • 3 {+ ?* @* x4 j+ A' o7 k

  • * G, h8 Q: o1 H' O- D; A8 O; C  k

  • ' Z( K2 i1 l( Z; j5 s) o
  •   p$ j$ c! h" F2 }+ K* Z

  • - E# \. e6 q) B* ?

  • ; b# f3 n8 ]' t, j- T
  • % s2 A* Q. c% K6 p

  • ) M. R2 c: m; L$ r

  • ( s. i& @$ j  j4 ?
    . m" k6 O4 w& R$ \/ ~

#绘制中国地图,并标记各省会城市名#引库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")
6 i5 M" r% A! g9 l1 S! P* x


% l$ I) G3 B2 y/ h! B1 A. R1 a% l% [) y8 h

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

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

f5c3384582002193c2c6c354a3d26729.png

% j% r9 k9 L( f# v" u

  •   ^- w8 ^* q6 H& Z

  • 3 C' v5 [- f3 t% K* h$ A, e, d5 b
  • ) C/ u- q7 l- e
  • 6 `7 ?, L4 X" p* E. P
  • + k' s: t% I# ~, i$ v
  • 5 ~* n& i: T) p2 y% l) M& p' o

  • 7 N  c5 x3 o7 O6 o9 m
  • : O* g6 H+ s# u8 f3 T$ S" F

  • , E5 F. c3 l7 X8 R, S
  • 4 R1 K2 C4 w! z

  • ; \/ Q  r0 h! s& K' ]

  • - @; i$ B  k- D9 h% t

  • 2 I* n0 p9 W3 v/ p1 J

  • 1 \6 ~0 \/ d! @6 n4 j

  • 4 k8 x- R# t+ [6 x

  • 0 n' F) U" O/ _
  • 3 x$ Q* \5 `+ B+ U/ T, D0 @

  • * t& g7 x# p: y4 D8 s6 V

  • # l6 ^, T' j; g! b( |* D

  • + W9 V6 e/ m/ H/ Y

  • & b0 g6 |; H! n6 [6 j& X! I* y; V" m

  • 8 ~! m+ Y8 H/ a  X6 X# x* O
  • 9 v. H* e4 V6 l% s
  • 6 S# }4 T/ Y) q- t4 _: j
  • 9 o6 h0 u( F1 }- C5 {
  • ) \: ^8 P* P! h# U2 l' f
  • ; s# K1 ^5 @; R- @4 `/ `1 \
  • 5 {% U) |: ]$ C# B& N* K

  • - m2 d9 A0 m" ]. d! |* M

  • ! U: a4 J* w0 E1 n* {( i

  • 3 b& p9 Y0 e* l+ I- \

  • ; s, Z0 m1 `  |7 w1 ~
  • 9 i: K/ h* Q0 K" y2 G9 b/ g

  • 4 W- v! f4 S3 y$ Z( h* ~0 P5 s

  • 4 t, k, ^8 r; n9 H9 `
  • ' D4 j' x% Z5 X

  • 4 Q, y/ `+ K. |. g; P: v& k

  • * ~- d7 b7 c8 V% b7 n4 H! G0 I" u2 E
  • " Z' [$ o. M; M1 M. v5 H+ H
  • * Y8 e$ u9 b* \" P! }9 C
  • 9 y( Q9 c1 ~1 `; g: K$ x3 G
  • % I( O5 |7 g- \" c6 {  S6 L! l3 z

  • 0 B. {5 w' r  ~; e5 Y# y* j

  • ' `% I% E( P4 ~: K* f! t- c! z  P# N" E

  • " P+ g2 N3 f; q

  • ( [: o. ~1 i) }+ b( [

  • - _8 S0 v1 _1 E' ~

  • 4 S1 T2 V# x$ U5 y' y

  • . Q9 {0 @! L5 G. W

  • . ]. D$ e, Y0 N
  • - x+ K* ?) L4 N) U

    ' {! ?$ z' I7 O4 _1 I

##绘制有海岸线的中国地图#引库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()
( N4 y; R# D, A1 B. m


9 h6 E8 Y' {2 ]' t$ a3 B  z- a6 w
4 G( _7 \7 l) M

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

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

28af454b4567839d9c888c0e3809708f.png


; h) u1 f8 W$ `/ [* P' L: ?

  • - _/ Z, M& t- l  S

  • 3 c/ b: E; `/ s( ?! j$ V

  • & x( Y, P! N5 i& M9 O% y

  • 2 g) v- r6 }# u" j5 J* n

  • 9 v: L0 b7 {( `4 g

  • ) z8 j# g( B& C3 M# n
  • & X) c  {8 ?" E

  • 9 n. r$ Q; s0 A& I' D- |8 S
  • ' i- n& j- ^) M  h) Y3 s

  • - q, T$ K! M! J& D2 ^
  • / O3 e& z) j$ c$ T. b# _$ r3 Y
  • . u* [1 v7 m9 s1 A

  • % d( j0 L$ V7 ]# K
  • 6 b* D. J( Q: v8 @- D4 ~# ?
  • ) l2 ~" O4 S$ W# W7 V% |, E

  • , K0 I. c9 C9 B

  • 2 g+ h# s8 V8 x; A
  • . R6 F9 F  i6 f0 Y6 J+ R, T6 a

  • # z: A/ Z  L; H3 Z7 ~* N: [
  • ' @- A2 u4 Z  |: U9 J
  • " h" {5 W. ?1 G- f

  • 2 [2 e% U/ Y6 N1 r. `3 Z* v
  • * W) l2 [5 R- p; }% [, R

  •   d' D6 t5 k  A+ W: B& x

  • 5 E% X0 f: q3 s

  • . Y) \" p% F& p
  • " Q. U' [8 \  B; P/ m  \2 H( O
  • : W) x% z  V; W$ b( }

  • & n( {& E# T$ I$ Z
  • 9 b6 U" t  _; }
  •   Y7 T8 Y7 m, U( a8 h; E
  • / f  ~* v- l( S  s, g' F+ C; Y7 G
  • 7 G" {1 D! P$ H9 t- n. y/ K
  • 5 C" v! [* h! ~3 Q! D. M
  • - T$ A) k; `+ Z( m  C! J( L& q

  • 4 ~0 l  h7 O. w2 V& p3 Q
  • 3 N' h2 t. [/ h& e

  • 3 f6 Y; _; m" x
  • ( a9 z1 v6 j+ }! k3 [
  • & H2 N$ Q) ?' R! q
  • ! n5 {5 `! A  w. L
    , f, E. `! J) m7 _- o& }8 t! G

#例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))
9 `: l& k( e! K' K: a- c


7 @5 k$ ~3 `1 S+ s$ n8 p

* V  _( }! J# A: k. a
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


8 A1 o4 {" v0 p: J

  • 3 U( D& [" Y8 D0 p! ?/ l: @
  • 4 @( S- B# {) C0 u0 z" t
  • 6 R; Z7 I# H# t" ~3 s  }
  • % y3 d4 k/ a3 L. j6 f2 [" _

  • + _) _* ^0 N+ A+ B8 n: Z

  • $ l6 K0 T. l3 N; y" x) r0 [
  • ( e) g: ^! y- y7 |6 J' \+ n
  • . _6 O" S: H3 N: C+ q7 B

  •   I) i$ o* n  o1 W2 Y0 Z

  • # P* Z5 `% T6 X/ D, X2 h! `
  • - x' T2 U% O  f5 n, l

  •   d1 m0 C. S/ D3 D* ?, o* Y! Z

  • ) O3 a7 s& q* a" x
  • # @5 K: X0 z7 e$ n4 t- K" W* \$ ]7 p
  • 1 [9 P  ?- `) {3 n
  • 9 T8 C- A5 L) a* h

  •   |, {' F/ o' F) z& |$ F$ l
  • / \" l  e1 o  ^8 k* z

  • / h) R7 _% q4 W0 e- ^, K

  • 1 \* q6 z# j% }

  • ' U* F- M" ^4 ^- j+ y
  • + T5 n% ~- L# Y5 |  j" a
  • / M# J5 R& ~' W5 O7 t' N$ C, `
  • & f' l* h, A: Q* s, N! F1 r* D

  • / y& F) h7 i4 ~' k/ V

  • ) ]- L, A% O* s: l$ Z

  • ; R2 }' D7 u2 l  X. g& o7 t7 F
  • , V; _8 j* r7 a0 r

  • " Q$ g$ F- f' V

  • ; w$ s) i, k$ E) C( o

  • - b3 \. l/ n; I

  • ' j* R, P+ `6 g; j
  • ( O8 z" Z- F' P

  • 8 g; F5 F5 g6 V* A$ C4 F

  • - d/ F5 z) x) z
  • ) ~7 e" ~5 e+ @. q: G
  • - T- m4 ]* l* \- I5 i2 v
  •   m5 h" K2 V' }" H5 }8 C
  • 5 A. s# B& p" G& K

    ! [, S; e' y3 ]( _1 |2 k

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))  e% _8 G$ L$ }1 g. u! Q


, }; Q; x% i3 z7 M% E( M
# z/ m8 M+ K2 V: P# j. V' D

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


' d  j$ M1 I% i6 m. |7 Q
2 P1 ^) N8 t7 ?$ t; S
回复

举报 使用道具

相关帖子

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