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


    2 X4 ^* P5 r( q" m5 Q/ i# A0 p

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


7 f3 U) \) ~4 n$ c- ?                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • % N, l( _6 X) G: O
  • . {2 c# j- P5 ~0 c

  • 9 [5 @% D9 T# g8 w

  • * x0 k! ^, H5 b& H! i( |5 i

  • ' H9 u$ b* }1 h$ i+ J3 O$ k
  • & N8 C1 [5 `2 z- C" g6 F  L- ^/ v

  • 4 M  `" \- q" J2 O8 d7 E, k

  • * X, b! T  ]/ e' _& {/ q( D

  • ; W; G, }4 q2 S
  • - A* w6 d2 k$ X8 `& r
  • 6 P* b0 u' k4 q( o, `; v& ~' V

  • / d4 Y$ s( @, y: L/ z
  • $ K, j% K/ X% k* j0 l( y

  • ! Q7 ?9 l6 {; r7 n; V

  • , Z8 t& @8 p7 P5 o2 T4 M

  • " K- N' L" K$ N$ N

  • 5 S; h! z) H2 U4 d: H+ A

  • ) h: E. e9 @7 K3 \# {- h0 S

  • ! ^) l; M5 C3 S3 r8 A' Y1 X5 I
  • ' V) e+ X: G. E' X

  • - S" }& d1 L' t9 f0 ^

  • 3 N' r+ G2 q! ~/ z6 O6 V. E3 v6 {  G
  • * j  m3 Y9 ~9 C  S" K

  • $ R2 v9 o/ M% Q. r3 m

  • ; s4 G. b/ K+ f& A: \% Y1 M5 r% Q$ u8 Q0 k2 T$ s. Y- e  b9 i0 X

#绘制中国区域基本地图轮廓,包含省界#引库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"). `$ w% d! o9 Z/ C" \


* s* K* ~8 s1 h& |% ^
6 @+ h* q$ M1 w6 g* w

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

5 E3 b0 t5 v, z3 C( W0 o

  • " r2 A' H. b/ `. L! q

  • , g( {7 z% m; R
  • 0 N( R' L+ z% a8 Y! H4 m

  • $ W3 a% D0 l5 H, b& F' K

  • 0 N" L; [" z6 Y, R

  • 9 b0 X9 M3 s# z4 w

  • $ Q' W; E3 {! I5 D, T- L& d, W

  • $ k& d9 \* o* ]. S0 W9 R( d7 ~- A/ p8 z

  • ; q8 Z" s4 g5 T8 D( N2 ]. c

  • & L, ?# k, D% Z) z1 U
  • 3 X& l! `* x* h, H& w- J- o

  •   s! e: `' P+ I8 W( r; T0 G* X9 U5 l

  • 3 F/ [; f& Y! V* K0 g# M5 I' f
  • ( V  ?4 [. g$ u2 c
  • 1 d' H6 V8 S5 v8 K0 f; k4 I" |
  • 6 k, n3 t- P* B3 {, x
  • 7 b$ W9 F! \! R! t4 L

  • 1 o7 [6 l: p( A9 z* I+ k) s3 V
    ( l: s8 n, G3 r+ ^4 I8 J4 q" |

#绘制中国地图,并标记各省会城市名#引库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")" }/ O7 I: O) c. f5 l# K1 ]: o) B" K7 t

3 w+ G+ z: b- B) `0 `$ b
, Z7 k4 ~- A. C1 L1 q' W$ E

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

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

f5c3384582002193c2c6c354a3d26729.png


( S. Z6 j& j) e
  • ' L; [* a4 B7 L2 e6 m; B
  • ) v2 s) Q) k: C2 K  S# J
  • 3 j* a" Y( p- l- c2 L

  • % l& J! F9 _( o* |$ A; a

  •   ^! a( V. c) G. G+ L

  • 2 b1 w2 ^. e2 C/ I; z6 ~1 K

  • 6 @! J9 s: b0 N. S5 a0 v! u
  • ; ]2 V$ z% h, S! ^2 C1 C
  • $ K/ y5 b3 `* y( k
  • ( {8 Y6 @6 k7 a( j5 c8 W1 g

  • ( n/ e8 Y' B, e
  • $ u1 Z" o$ j+ c; O& {5 D3 g
  • / X8 Y; H/ }6 Z7 Y7 {  `+ ]

  • 6 c- W! N! |+ e9 W3 w7 Q2 i
  • ) d5 r+ V8 @& C
  • " B6 g1 Z, X2 {
  • , Q* C9 g1 {& p4 S
  • - W1 k: T6 D  K7 E: s9 B

  • 5 b( c' D6 d. `

  • + m6 D* T4 Y7 ^

  • 0 d4 J/ x7 ]! q% W7 p/ w

  • % o/ b% z; ]7 A
  • % ?1 t" j' ^! P1 T# \9 o4 o5 v
  • $ {# K. t5 i* z
  • 9 C4 S. F) S) Q+ g" R

  • 2 t, ~9 @' a4 _' X4 a. d4 _! W- P

  • $ X9 r9 @) c1 _( W/ S6 |* [; U

  • $ P8 b5 P1 I+ A  A
  • ; A9 K; l$ K! V

  • : e$ X" b) T! l$ O2 ~; m

  • 0 n6 {- w/ C: L
  • # R9 R' k' c: P% C

  • 6 n8 z7 K1 L+ l" G$ v

  • 7 q9 c  b0 H5 Y% M
  • ( |1 O1 C' j' Z' p' V9 P

  • $ H2 P$ E9 X0 |( [! X0 W$ v3 X

  • ' S( m  ^* d5 F
  • + I; C0 P5 [: @1 {7 z% Z6 h4 a

  • + u) o. e8 D4 _& u. a

  • . J- u; J. w: u8 j, i" I6 w* a

  • : H% R. H6 o* W+ m

  •   S; x8 S/ G/ e9 e
  • 5 m  [$ M+ [% w# E4 A

  • 6 P9 ?; w. s7 r2 {7 T8 B0 N

  • 6 v8 E) I7 v9 Y% s# G. A) `

  • 1 ~4 S& n! q7 G0 T4 m5 |# L
  • & Z0 h- q, h$ ?% ~: w
  • ; E1 {  O) _3 H4 D5 R
  • / }1 l. f- b( _4 E* Z
  • + _+ k* A9 P) Y, z
  • 3 k* j$ Z% {4 x

    ( E2 @9 g# V# p1 t4 C# O

##绘制有海岸线的中国地图#引库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()- S0 s( @: ?8 t4 ^4 [# t


/ v% e8 `( N) }% k) o) a
. W" H' W/ F8 ~

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

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

28af454b4567839d9c888c0e3809708f.png

( q2 A# v: j( }* W9 x

  • . \: [# v8 t) |, B5 }! p! n( m
  • 0 P3 g$ y% i& J) e5 S
  • 0 c% E! \' w" Z/ b" y7 H% p
  • - w3 K* I& O" }8 K$ f

  • 1 N( L- T2 ], x1 R1 y; Q0 r- M" C$ l

  • ; S4 m4 B" x9 x# t

  • - F  D1 q6 u  t: _
  • ( B3 B( s8 a1 i. w5 F$ f% Y

  • 0 O" d; Q" Y  s* ^( B
  • $ `, K3 M, u( j/ O; K; u; n4 w
  • 6 z" W! g( i! U. e2 i
  • ! P' k' p- L* D& N6 ^  J$ Q" B1 ^; Q

  • : i3 k+ M' w  ?

  • : E. |8 c) U8 ^, ], d& N5 k8 [

  • / W: v* w+ g$ t  B; M$ Y5 p1 k- I

  • # X* J- b* @0 k

  • 4 _/ v0 j- _9 Y6 J1 F
  • ; _+ y2 E; ?3 ~3 Q4 f4 v6 K+ k0 Z6 G

  •   T" Q$ \2 ?) Q1 u! S
  • , Z+ t7 l9 q& m2 y0 C" ?
  • : K0 a. b- f4 o4 y$ H0 `
  • 3 B+ \( O) t# l( \: H1 {$ H$ I

  •   k0 V. J; I: {5 x

  • ' Z- A1 j7 C5 D$ Q. B) E

  • 7 [) ?: p/ [& `) o6 J

  • . N2 `4 s% N( d6 t8 ?

  • / i: U8 j5 W6 ^1 E

  • , l: i6 _; e( a; V
  • ' y$ o' B- D  K$ ~
  • ) g- j7 n0 z* U0 x& i* X7 A5 _' v

  • " K$ N& h( b5 Q

  • # T3 F; L' L! t

  • ! i. t/ ~: o9 G6 V5 b( m

  • : C1 D: D9 F: |
  • - v- {5 R" C. g2 e
  • ' {  W+ |1 _" s+ _
  • 8 g# s- C1 }# F
  • - ]  N& }: ^! V5 H* e

  • ( B- f# L1 n% i  I( C

  • 2 E1 y4 [/ {3 {5 V6 Z" O4 H
  • % |& v/ a* O1 w' R
    ' H% S% H" `9 ~( u  Q% d8 s

#例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))
, P  I+ f  q5 e5 [! u

3 R% T9 h' R  U& d1 A


$ X( ^3 X% r+ G6 y  B% c                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

+ N9 Q$ ]% e. K2 R0 }% Y" N

  • 2 X) p/ T* M' }: `

  • " w: k- D+ Y' ^3 L7 Q6 p
  • 6 X) A6 o- ]5 ^2 ]4 z* W8 t. [, X
  • " U1 d4 m# O5 X* K

  • 0 `( U% g  ~7 a/ `; a( Q9 A
  • 0 X! _) s6 m( ?; t
  • 2 M9 c# N; y, ^- z

  • ! M0 c( d$ a6 N( A9 `

  • 2 z* g9 T, g) \) T1 y5 e' \5 s
  • ' N0 u4 C- R0 G) O) @$ _6 U

  • : {, D  Y4 _1 h! z  |! E
  • - k2 S; B8 Y; R0 S
  • + t: G3 b9 h/ t
  • & ~, R* b- T0 Y
  • 0 G3 ]$ e% s/ G  a

  • ; U/ O% D+ Z1 H. ^
  • . c& t" o$ f4 R& o. I( y

  • ' K; s" K. Y' `% ~

  • ) c8 D3 Y% n; x1 o

  • , W6 Y% @4 H4 u% s5 _

  • 2 `5 s4 t& {- \8 w7 s9 o6 l
  • , p8 Z* `3 c# X( I% B5 N
  • 4 L2 R, P4 F8 H$ f1 ~4 ^
  • 1 h7 c4 ]1 M. G! V
  • ! z2 i% M- }1 S( X% p

  • # i* i- t1 N: d. X3 y

  • 9 v% o9 M7 O, z( @1 `
  • ; U" g0 k3 k, b, y. t
  • 0 e% {6 \. G& s

  • ( R( y, |" B. F! w7 {" L8 E. c
  • 3 r5 {' ~% V  \  M! D$ K

  • + d7 v7 t  l) E& o
  • 6 @  e/ Y7 P" x0 H/ X
  • 0 J. A4 F+ [/ B2 r
  • 4 \+ g: u9 V( F( `

  • . V. [( g; ]& V) [( L! F: {

  • % x9 R7 {1 t4 H4 M. D

  • ' p) E+ k+ ?( }) U: F! Y: ^
  • , A! f5 q" I8 D8 J4 H' I

    8 R7 b. [3 S3 J9 w

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))5 Q* x5 M- X8 S1 T; J# ?


: Q9 A( ?# z* k5 W! T! ^% V5 x9 Y% ?7 {8 R, a* ?

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


# ~2 K  b! ~7 U  B5 Z% M
* C; v$ Q3 x/ {9 _/ N
回复

举报 使用道具

相关帖子

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