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


    , O$ T7 W# D* O# W. h6 J0 @

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


; l3 T# |4 k, K* ]. Y                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • $ C  j) n3 P  J' u& f8 i. C
  • & d8 m  ?3 k2 z8 ]

  • ! h. k+ }$ H+ G8 t, X
  • ) G- A% K/ n* _% _

  • ' p" ?! \$ l$ m# q& r

  • 7 f3 Y4 [2 u5 {6 k. a. g& W! [

  • % n4 C9 O& q/ @8 k. U

  • ( ]1 [9 h% L9 f+ E! k

  • 4 H0 m; k+ e7 {7 O0 Q0 l
  • 6 u1 q0 L- c2 }
  • ( a" \- g/ p0 u  D. @5 c: y7 q

  • 3 N$ a0 ]: }- r
  • 6 K$ f3 e8 o& A4 ]$ ^2 M

  • * ^( k9 |1 t( X, |$ {  Z: {8 N
  • / u+ C8 O" x2 M
  • + P9 C3 U! ~8 v6 p3 N
  • 7 o( _& K4 v3 f; n  \. I3 N
  • $ s/ W& U7 V9 n' c
  • , L' v/ w. B: L/ z

  •   C) U0 Q# E  A5 Y& B8 _
  •   q3 O/ {% e- T  C

  • 5 f8 |5 {4 c5 T* R$ g( f
  • 7 E! W7 d2 d# m, r

  • 8 L% k1 m$ r0 @* r3 s

  • # f! a9 ]& Q9 |$ P, A/ s8 |( p; q( e2 u4 v9 ?% r! ]

#绘制中国区域基本地图轮廓,包含省界#引库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")
, n* p, A2 P( D3 Q, `/ c

8 g; D3 A. N4 X/ ^: O+ A6 T$ z+ ]# s

/ R2 D. i- C! p

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


) ^& m0 w$ ^8 j' e* b

  • , _+ T& b' X" H6 [1 ?3 b
  • % U2 I' v$ {& a0 L+ s& y3 g0 a

  • - y* u2 P0 K% ]( c8 j, J, ?

  • 3 A& C1 W; d& R1 f5 m

  • & Y) s5 T& l/ X, E+ |
  • ( e3 o( J. q/ h6 {1 T; p

  • + [0 h% U  V; m% b; p2 A

  • , x' m% K* b8 U) z: S; m: R$ B

  • * y% K7 Q- I) u: Y' o
  • ; G" R8 i% z; t; c% f! l
  •   D/ W: k' u! m

  • - W4 O3 Y4 \: p/ O, X

  • * R  N" \) H- \3 V
  • & y( A) c; V. S1 R6 {

  • 1 n2 R- ?! f& Z( w3 \& ]0 X. v

  • * Z+ H) o* M! `, {
  • & P) h* W+ y+ o- R. e
  • . g* w& s8 T- R; R; b
    , _1 e8 l8 A3 `

#绘制中国地图,并标记各省会城市名#引库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")7 J& O+ C, e6 I3 a2 n* Y& D

$ X- d) V9 D4 z; A
* L; e9 ?; i' l: W1 }& e( i

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

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

f5c3384582002193c2c6c354a3d26729.png

4 P9 m; y* x; O' R

  •   b, l+ P9 }% a' a* V. O  F1 k9 ]) q- \
  • , _# n6 j- W# H& t+ I0 |( C3 x% e

  • * m# U; s3 d& c, f- ~, v6 z: @

  • 3 P# G, E4 ^: Y; e0 r

  • : Y; s5 [4 U9 y# V

  •   a8 |, f3 w$ T  R
  • 0 P9 S, H# |, D, ]# M+ p7 D
  • 3 e  @3 X; w% q# G. H. g

  • 7 F. Q2 I% _3 H; u) }4 I3 Z

  • . D9 \1 X" F4 M; P  f' L5 c: f
  • / c4 T" u9 T$ P
  • 0 C0 ]; `( o6 \: w
  • 7 {1 i& w; v. @1 C
  • 4 a/ r+ L. N: h! \  m0 |5 g

  • 4 }* s  H% S4 o- n8 e' x6 Y, d
  • # U! t$ m5 g7 L  w, L

  • / T. ?* f3 t' z7 N0 C( K

  • ( l* P: |( O! N  ?+ }

  • 1 m5 u: f. l3 C" X# i0 K. Y

  • 9 E  ~* b& I3 Q' I& z

  • 4 F; E8 |3 Q  t. i, ^& Z
  • 9 P  V$ b2 W. `

  • + z: e7 C) H+ x/ \9 |8 k
  • % v0 z3 C1 w. U6 [
  • 5 t- a0 D0 {: d5 p% ]

  • & P! M! z8 L3 m: o5 N1 @& @
  • 3 d- R; I0 W0 {8 v# E  R% T
  • ( m) ^9 V. e  \7 w  q

  • 0 E* j- p) c' I: e
  • % [7 Z! B: q" u3 D

  • & f' I3 Q2 [0 @- [0 K/ @
  • ' E9 O+ Q5 r2 E: }0 k& ]! D

  • 8 A# v+ F/ S9 b" ^
  • ' b" o% a1 M0 V8 h$ R7 _) W
  • 0 E) j# |$ b3 ~& r
  •   x# B5 z0 ]! }  [$ ~- G

  • , ~7 D; ?' @6 R( k, s. Q. ~

  • 2 \" H0 e( A: R  ^8 K4 S! A  M; P
  • 5 f- b% X5 ]* S( E' t2 Y" `
  • - y; y' ^. \0 d3 q6 S% V. I. i

  • 8 A: @# X. F& ]9 t7 j. T

  • ! N1 _) H% ~. i3 X* \/ d. }- b$ o

  • 1 u/ g0 q) f7 j0 N1 X

  • * E4 y" l  \0 t0 j8 W9 ~1 L# i: c
  • ! m- j: t) f3 i+ \  B

  • $ r3 y- }+ a& }

  • . c$ G7 F$ H2 X7 V& w! X  t* Z5 \) Y

  • ( @8 f' f' e/ u. q* K9 @

  • , s  M* i8 i, I/ E
  • " c" `. K5 o2 }$ F5 e5 ]5 B( b

  • 5 Q& n+ N: G, t$ d$ }8 j$ k* }" z
      Z& `9 o4 V. r" A( 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()$ @) q2 S; I  S( {


" U" i5 C& ?/ ^0 B8 T$ J2 ~6 q  _! Q% V7 a

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

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

28af454b4567839d9c888c0e3809708f.png


1 h  M4 J8 L; @6 r/ O

  • 5 ?7 @9 ^" N7 O/ g0 G

  • 2 v: t8 S) H; D0 l8 ^; `6 ]

  • : ?6 U* s2 @8 _) r
  • 8 ]9 h! g4 g3 b1 r0 [

  • 5 s, x3 F# s$ D
  • ( P) u: r: k2 b) @" M

  • , N" G) c& W" f. }+ \

  • + |' y- i  F- I0 g0 B9 z
  •   Q5 I1 z0 Y; F; f
  • & T8 c1 |! ~* b! q0 {* R
  • $ Y8 z  o7 _' V) s* `' ?" ]
  • & d- }7 _& u/ C  a' k0 p. m
  • 0 \! d$ ^& |1 ]) J  P1 X5 Q

  • # n' ?0 I# ~4 R8 e; b
  • 7 y- p8 x! Y, T9 L

  • 0 G& Z; }$ r/ V- q4 s6 Z

  • ( I$ f" v6 P* h9 [  c1 y" z9 b
  • - |6 T# [* K  Q( L2 i+ |

  • " W" W$ g8 I' Q" j

  • ; _: @/ }+ K4 g( B" a  P
  • * n- P4 f; T& K% l- ~
  • ; G2 H$ o* Q' F% i' t- [

  • 7 V3 b5 B2 l4 h, M2 b

  • 5 s( a! G2 d2 ?! Z1 q$ f
  • 3 l# B# T% H+ R- R1 R# n9 s
  • ( f) {. n$ C" b* V
  • ' A! a$ a. E& ?

  • 6 I0 t5 ?1 D3 i) T

  • - \) E. J. D% Z" c$ ]+ x

  • 9 R1 a4 u! ~1 A" N0 o
  • ( L, e" f0 C% u0 q$ l: W

  • ! f0 ~0 g& h4 `/ K
  • / o" p1 F( Q8 Y
  • % S$ d1 K% J9 E# M5 V

  • & h4 G! ]7 Y1 R$ Q9 u% R9 p

  •   p- f# J' M: [  p- v
  • ' g2 Z. ]- n# m
  • 2 ?* A0 K  f- ]/ k4 j3 E

  • # u7 I; W9 a. f$ G9 L

  • % ?& F% O; Z8 z
  • + C  z& m+ W1 J) R0 Z$ p; ?

    / A7 Q3 P% n! m2 w

#例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))- H- i4 |. M0 T! F4 p) J' x


4 ^: `2 _- r& _9 |

5 E6 N. D3 U) K' J1 g0 V
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

: q; B% O' e. d& S, G
  • / s7 H; p5 S% f* x4 _3 f

  • # e* x& r2 O3 u' ^8 Q

  • 4 a- w# `$ V+ ]1 K: M- Z
  • : g) o- b- u! I% n
  • % D( T% ~- a! D) }; c- d
  • $ V9 y; x3 d/ B7 U
  • : U8 {/ N/ ^7 D! R0 F$ Z

  • : Z* @! A, G$ E; f( d2 a
  • - H6 k2 }) j% H
  • ' t( |9 Z$ X# d

  • ) O7 _- e. o% \* t4 m+ B( B2 D

  • & ~6 a2 Q6 e: ~( e, z

  • " t& V/ E7 `0 J" _; \! Q- F

  • 9 q6 h0 u4 [  e- t+ m
  • / q- T" |, h7 C, P
  • ; s, U' o1 i; p1 K$ [
  • 4 }! e! G' y+ f8 E
  • + k& i, r+ D( r  W

  • 5 i3 x& d" m; }4 l( n& D
  • : S* V" Q; X2 G" K2 ?
  • & t6 v" T+ T& N3 _* W- \7 `- J" O

  •   g( [5 E) [4 t. p' `& m
  • 3 W1 R7 A# M5 z5 V+ l! d6 |3 i
  • 6 R" d& Z5 c: P7 M7 ~+ E
  • # A! L; v! |7 ]+ I4 D

  • * u8 S7 z% A+ F6 Q$ L
  • # H+ i' c( [8 z5 ~6 g
  • % }1 o/ h) }# ?6 }, k7 J

  • & M* |/ Q5 R2 c& @

  • 5 ?% T4 L+ n5 M  n, D; V3 R* Z

  • ; r8 O3 ]* Q9 z- i
  • 8 t: k. O! R% V8 G) E% g. g

  • $ Y4 q! v8 I0 O" F  N+ `$ k% L

  • 4 t( M7 S$ g( Y1 a3 |9 w
  • 2 |' C) L9 l3 `5 W4 _! k; J% t

  • " o) j# d) p  Z' ^

  • ( C2 f9 X( q/ V( N# T5 R( f
  • 5 y; M0 Z  B2 u5 i/ O

  • & `4 H% J" {1 B) q; G- E  h. L7 V& g& {3 F* k. 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))- ^. r# a$ E+ X* \. q3 V+ y

" K" }* k  R/ F3 v% B' ?' {
2 z9 ^8 Z; d# L& D+ ?9 v

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


' e0 V& h& `) ^: n' `: n5 }3 H* U. ]7 I) y. u' ~! p
回复

举报 使用道具

相关帖子

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