[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("···")


    . n' m5 ~+ u2 R- j) x

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

6 q' O# O4 k0 v; z" H0 r
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • - P; L1 C: Y  s' R" Q

  • 0 s6 B, g; ]. K( G3 c

  • 1 W- p! S1 C6 I

  • 0 k# k2 K5 H) K) }+ Y( o
  • 9 H; G/ p9 m. h. ^+ N
  • . [7 B3 v6 [$ e' D9 Y# L% b6 d) h

  • # m; Q- s* X( I( @# r. Y) Z7 ]

  • 4 S9 [; o; E+ U+ |7 s* Y

  • & |( {7 z& [' W0 P/ c3 ?, _! O
  • ; K3 x6 z" \( L; R- t0 D

  • 4 p  I+ D8 G: T' U

  • + Y% K" p: o4 L' S* V( ~  s& \

  • / K, F/ w5 z  i- _0 j# I% ?
  • $ ^, u5 j+ p  u

  • 7 B' g$ x; a3 I- D, l; N3 h8 K

  • ! |& M- _2 o) J( c) H  g

  • 4 ?7 k; P7 F% |
  • 3 ~- \2 l+ j: H4 }" w
  • & W6 D4 v& T2 I9 n
  • ) o: P/ @" J; L1 s4 p- p, @
  • # O; G/ U+ n5 R) {

  • 4 p6 K3 U( Z$ ~3 X9 _3 p- N0 A
  • $ J+ s+ D; R! n$ M; U/ v

  • , m  d3 a% G# a

  • 9 r; f& T; Q4 Z3 y0 s0 s1 ]- {( N) k  c, D0 Z: l, g2 o

#绘制中国区域基本地图轮廓,包含省界#引库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")
; u( t0 u4 W, W0 W( |


# v! L- h+ q% B/ Y9 a$ y
- b! H, y: r) ?6 S9 V

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


1 c; m0 w4 \( Z3 N% i4 N
  • 5 m3 u* X4 ?& X, v/ j. P

  • 7 m( E: D* B! ^0 j+ ~

  • 2 r7 }3 r" R# S# \+ r+ }+ F

  • 5 D+ Q1 d! e& G3 R

  • 6 P8 M" b" Q5 ~0 p

  • 6 z' |7 [$ u9 A) v" Q
  • 8 N0 |; D% c3 \  j& G3 B* r

  • - k8 S' G3 y# A! E, j

  • ( X% e5 S! k+ [  g' V2 C

  • $ g# J( b& q/ a7 n- E+ D

  • ; g) W7 {% E8 r# A5 j0 B1 K  e" L

  • 4 A% w1 m2 @. m  {0 P2 r3 M

  • , ^3 u7 J# _* S1 g* j) _6 V% w- I/ o

  •   I1 c' W/ E+ U+ B# d+ |
  • - W$ F* d+ X/ `. i3 ?
  • - e6 u* E; x5 h8 b& H/ w

  • 5 a/ X( k) S; d9 a/ @# b/ F

  • ( a: h8 h, \2 N. t. o) l
    ) R- D, r" ^8 z& Q) y. N

#绘制中国地图,并标记各省会城市名#引库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")
. p& N' e# g- |! p- c+ F


  V4 ~3 }" r: @% }& ~9 \
% p. }1 P! b- {1 k- D, h/ h& p" u

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

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

f5c3384582002193c2c6c354a3d26729.png


" B" b$ w7 M+ j) T
  • . c! @( M- u9 d& q; h' u0 H% q
  • ( \" ^1 j: y4 s. ^* }3 U" X3 f

  • 4 }2 K. k- ~, ?* B' z- |* C

  • 8 J+ U% [9 R& F: f4 |
  • : u9 r8 N) a* x; @" A
  • ( H( X) Q: r, {
  • 6 v1 T1 f3 }  o! J

  • ! s' M% n$ {* q9 C% K) ^
  • ) E- }0 q& P" L6 K' q% ^( ~
  • , p2 m, |! p$ g) e1 Q
  • 3 A! ?$ C' N7 L8 O* X6 a

  • . K# I* x1 i) {# T1 {

  • ! N  `4 p" t7 j$ v! p# d

  • 5 e8 K6 Z; X$ Z

  • " m4 y0 ~! w5 e0 r* _# o- j7 P$ j

  • , ~: k8 s( J( O/ _5 x
  • % D( c' c8 K: h3 E8 Z' p6 {+ T
  • ; j5 U1 D; w* R5 R9 N

  • 0 ^/ V$ r( E( h
  • 8 K8 J8 O7 @- b9 v5 V

  • ) ], |: P$ M+ `2 n4 E# o

  •   S* m8 R, N! r3 W5 c% a* m, {: \

  • ; X6 `* r' F- R9 l3 R
  • " z4 v$ b5 L0 e' H0 X: z

  • ) ^& A4 M6 S$ h9 |, f
  • 8 ]8 A/ |' _8 O9 [, R

  • % ~1 K/ G" I/ r" r+ S& d
  • 2 X1 @+ k0 B; q  i1 H

  • 0 ]2 X+ y& H3 ^  L3 [3 H6 s

  • 6 [% ?- ?' O/ D* w
  • 3 m/ {" G! f  e: y/ G

  •   G' I; t% O' s

  • % F9 t- e" {  @/ u  L) d8 T
  • 5 }. p9 H5 n. Y: v, k" ]

  • % s+ I, x; P4 B! F" t5 K: X
  •   P- h/ W+ c6 }/ ]; j
  • 0 l) }" d( L4 n2 p
  •   {9 |6 B" h/ R+ K3 N
  • , q, R# J9 \* t6 Q; O2 n

  • ' T6 W$ M. ~3 A9 w7 W
  • ( z4 N* ?+ k( `+ f$ j
  • # D7 ~' G8 ~9 F4 Z! z; o
  • % Q( V' J/ @$ f# \

  • " Q2 j/ @3 y% J! c+ ~+ t

  • ' A( l9 c4 t" K! m

  • 4 U, O. O' L- g
  • 8 k4 _7 `. J6 E4 {, D& M9 L( Z

  • $ ?. Q! E3 S7 F# p

  • ) l/ j$ N3 y/ B9 E( G  {3 G: B2 X! J$ ?! Q' J
  • % w6 ?% p+ K) J3 p$ v8 Q) o4 x5 V
  • 1 s' |4 z6 x2 R. W% P" J
    ; [* E+ p/ ?6 B

##绘制有海岸线的中国地图#引库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()
  ]: L* \! i7 R! G

, ?$ Y: j# b& @7 b- [" y

( N8 h0 h: U. G+ O# X

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

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

28af454b4567839d9c888c0e3809708f.png

5 L: c3 g7 M+ b9 w- q% @
  • 3 r. P1 b3 |: G  }4 Z+ s; ^

  • 3 f* K" u' U( H2 r) }

  • . U$ n  t9 K4 Y6 n$ O7 e, D
  • " \  j5 }* {0 ^
  • , S; ?1 r3 {* x. B) V# c& ~. ^

  • - Z! i) Y  R6 s0 j- h4 H6 P

  • ; b' U) X5 L' Y' E
  • " K+ |: \* _9 e( ~9 g# G

  • / \) [% l3 P+ r9 I( {2 {# K3 j
  • " _9 f. x3 M4 ^
  • 7 F' W' t5 D1 I' M
  • & ~8 G. u2 K" U6 r
  • / s& [; N- t; G" d3 v+ S# P$ `( u

  • 5 D. \9 y, r- g. v& X% a

  • 4 W: x1 j$ |1 f! h! y( }/ Q' n3 ?
  • 1 K( n, K9 ?. S$ c+ P
  • 8 X/ D  b+ f# J' y# K& f) f# q) D
  • ' s) ?( w6 u. L; l

  • 2 F5 ]. a. L% m6 q' g3 @

  • 7 h, ~; o) ^/ ]$ X% v

  • & W" a6 f& _( v: O. u4 P

  • * I2 B9 y6 T- N  ~7 a. [+ ~

  • 3 d4 j  F) ~! W7 R6 [7 ~9 U4 c
  • 9 G. P) ~3 ]& E. E

  • . k* f- C& P# U4 ?) w' q# i6 h  h" V9 i6 l

  • 1 t8 S4 d3 x0 k5 p* {

  • % A/ N4 K9 D& m. a( g) \
  • 7 n: j2 a) d. ]' z7 R7 k- h

  • ) y! }$ E. p2 ~- r

  • $ a8 d8 {2 w9 @& a& F+ ]- Y0 N  |
  • 0 x2 W" ?$ P, a9 \& `: q

  • + X2 u% f, J8 ]

  • 1 E5 Y. h' ~  K% p7 }1 s
  • ! M7 V& i$ N" p( s  l8 ?

  • 6 g" _1 m7 s- q! t5 l6 n( U9 G1 Z

  • ! R8 T6 I- |1 o' T* J& a
  • # }( z/ @" \/ Q
  • 9 z; T- r* v. h' s2 r
  • 1 n/ D; h7 p5 h% @9 Z

  • $ C4 [9 e8 H0 W, _4 q. s* K2 W
  • + v$ P7 u0 U# Q: a

    7 ~6 _9 R* E9 u8 Y

#例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))7 H/ \) E9 f5 |7 k( X3 F/ e6 ~2 D


% u5 }8 A/ D; u) r+ _, n3 d+ u

2 Z1 ]4 U$ D2 `- v) b* R1 G
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

: ?8 Q6 `2 l7 k) f
  • ' N5 ]0 t) m& y* |* l( w* K; p' a

  • % D+ P) U; z* Z- z; ~
  • . y( l( K! l+ P
  • 4 E' O% n5 N. b( I! p+ x  ?
  • 0 Z7 Q- B# L- @2 V
  • ' E4 k, m9 J- _) `, i7 y  b

  •   y% M* G/ R$ b% Q) s) v4 b/ \

  • 7 \) a1 u" [- U& J1 J, v5 L1 |2 w

  • - T7 l% _4 d+ d% Y; M( E8 {- n

  • 7 e1 E; o% T6 }" `4 H- K5 s9 ]; [

  • 8 E* l4 @% Z( u$ k

  • 8 W4 ~0 S: i/ m8 B$ |
  • 3 w% t0 L0 W. C( ?
  • + {) m3 I: s0 K

  • 5 k. I+ ?# J9 u
  • 0 c' ]" u/ C9 y/ U2 B4 }6 i4 f
  • 7 s! R* t# k' Y8 a$ w
  • 6 _5 T+ K8 O( M0 g/ |
  • 0 u/ H$ I7 M+ x  `% `4 O( I: ~+ W

  • 8 |; a) s% `9 o
  • / k7 [: B- k% j* ^! f
  • " M8 ]$ k/ U% K% r/ H' c

  •   C' l5 ]4 P) Z7 W3 m% U0 i$ `# Y

  • $ @. ?8 G9 E! M/ x
  • 5 y' i* Q  p- D/ Y4 R* Y
  • 1 \; `1 F8 q% l- g' R8 w

  • 4 O0 z. N1 ]* N6 r6 U/ Z
  • " C! C) k, Y. M& e+ _. }* N
  • . s4 Y. k  ?$ q- I* Z7 Q
  • $ b3 Z; ?& P" I4 e. P* Q: B- d
  • / M$ o0 R7 M: l$ n9 s! R
  • 6 a2 u+ ]5 N% j& T+ w

  • 8 [9 L4 {  `; v) X8 x: K
  • ( f6 D) ]' \; U" C7 Z

  • 6 n/ h8 L* B" ]  Q

  • . q2 q( Q/ e" M+ w1 T) h0 N, L* s
  • $ T, H, l. Z) m) z" d0 E! p5 C

  •   m' Y6 d$ f, V
  • ( ]8 Q- D5 t- r! {. F( m* A9 e

      [9 F$ Z  |( [0 L  x/ |

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))% ?- |) {4 r% s( m6 Z7 ~


: s+ N' |: y4 O6 Q" [6 Q7 t0 S% E, Y9 a( M0 {3 @8 c* g( J: ~

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

9 W. D8 o1 Q$ _

- \2 H" B" n; [

相关帖子

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