收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流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 M! y! i" f3 B! D

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


. `' @# t! j; [" i8 V5 |6 w- P                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • % C3 j# @' [  G8 y! H6 ~
  • ' c7 D6 x. b+ D: E) I

  • 8 U1 ]5 |) D6 V  V7 k/ \

  • - B" t9 k( I" M) U* a5 I/ m
  • 3 x5 v" f& y' T# L& A4 l
  • 4 ^7 ?8 G, z. I/ k0 c( H9 I

  • - Z, Z3 ^6 Z* _$ E. _* s

  • 9 f1 z$ F+ Y9 X0 U$ `# V- S
  •   R; M9 W6 L% {& e. F: B
  • 7 W$ {! \& g, V8 r

  • 3 [. R2 i+ l( N* F# O3 s$ r5 x
  • " o, c, [8 y* F, T: `3 F9 C

  • / O0 B* V) W2 h' n* B

  • , E5 T/ i0 S* x# U

  • : B4 g; d# T3 ^

  • 3 G& V% u3 ?2 T) b

  • : y+ S& C4 }+ H

  • 8 ?+ |- E# a1 l* j7 \. ^
  • ' D* u3 c$ U2 _  H8 M+ x6 p1 T& R5 X

  • # k9 d' v# n( B# F
  • 0 P7 H7 Z" m. A
  • 5 ~5 |- d2 V+ v/ S9 F; x7 _

  • 0 @& g" c6 d# r) i' R. t

  • 5 Y' {/ B5 L* p5 H" l

  • , {$ b* Y4 i1 B) z# J" e5 e6 W0 {  n* v

#绘制中国区域基本地图轮廓,包含省界#引库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")  v. j7 I* r% k2 D, L


2 N( O. g, |7 f: @. w4 e& |0 T( ~
* V9 ^) Q# j+ F  k

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


+ I  c5 y1 c1 z. S6 @6 D3 S. g

  • ( y% g% m' ~& y$ O# ^9 U: C* F
  • " r+ b6 [, S, X: @
  • ) V8 @* u/ a( T& @$ m
  • / F; x/ R" K: W
  • ) U! w7 m: k+ G( R& ^4 O4 T$ h" U
  • ) j% L& S6 U( e# `" F% _

  • / [, r$ V0 p! ]; s" e- A3 u+ ]
  • 7 b6 o* w/ E+ k* K7 v3 v" c

  • 9 X8 n& {# I) u) I/ [

  • # U* _$ N4 B$ j* H
  • ( ^: |9 _$ y8 q6 N5 @

  • : ?/ ]8 l( G0 `5 A- b

  • 2 K- V4 l# [- i. ~6 v  `4 f: @

  • : ~, P9 Y) G6 n/ D3 r- \8 V

  • ; ?3 H3 I8 T: F

  • 7 j' C+ u, l' y5 K

  • % K8 S; U9 a3 B! Y
  • 0 v5 \6 x2 T- }; Z2 ?

    3 _3 R8 `( |7 b' `. f* Y  }

#绘制中国地图,并标记各省会城市名#引库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")
* D0 b9 `8 j& @

" U$ Q( {( X% R9 v- K$ y

+ P3 ], W' D9 L3 J

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

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

f5c3384582002193c2c6c354a3d26729.png

. W# B! k( m& C& m0 h( n/ i
  • 9 j" C7 a: s5 \  y) D6 `9 h
  • 0 T' l8 J0 v* V9 k: E5 o$ K0 H
  • + A3 V2 o) M$ A; D

  • 5 u( `9 ~$ b: b# Z# v9 l8 M- V

  • 4 J1 q) I: ~; v& w6 a. [

  •   D- l6 Q  F  ]# ?- c

  • $ P! W. Q! K  m- }- _% U

  • 7 l: A9 C0 q% r+ ~

  • : d4 e, Y7 w3 Y4 q8 S
  • # G& A9 l( k1 @
  • * Y' T& A! r1 K6 q  a9 F

  • # v( N& A$ @# A9 }7 `" a+ H
  • ) J& ^5 I) f( q  [9 H' M# Z
  • 1 Y7 ~: [. |$ p

  • " x/ v# v4 E: @+ B1 ?

  • - H; w  a' S# d- o1 q# u( F- ^

  • - p2 J; ?  ?6 d  G
  • " C" b9 u9 h8 K- L6 ~. R

  • , s+ I5 C8 T5 u: m9 `

  • & j% \/ c6 B% b$ g3 c' t
  • / B. {5 s1 b5 B4 d; }' Q! z
  • 7 p+ x7 e# J5 i" M4 o
  • ' P3 m( ]7 [; p/ H- t" }+ G! J  n% K* U! r
  • & X& _6 _7 U' Q7 n

  • % m# t. L3 L& r* R5 \. ?$ v

  • 1 l* N* Z" t2 Z9 J0 Q5 u" t
  •   i' T% _2 x" C5 l

  • 7 L- z! I+ ~6 K0 z
  • 2 t. `- o$ f$ p4 R- V

  • & f$ Z  W, M  d* f' X
  • . U6 l6 y5 n) p& t
  • * ^! ^. W! M$ ]9 n  b" b1 s
  • ( S9 O; Y/ h# F6 G7 M* I$ Y

  • + F: T, Q6 S$ e3 `( |
  • * |1 v" f/ S6 z1 e9 V

  • ' b3 Z9 J2 V' {7 P  e% h/ f
  • & B3 o7 h/ {8 V  i! W

  • & H: H1 R/ y1 X" g  k  k

  • % ]  X5 G2 g2 N, E1 e3 T6 l
  • ! _# t) l9 S+ Y% ]/ E$ K8 A- f

  • - ]: v% Z2 |. x$ H' F
  • 0 W" L+ c/ H- H* D  j# j  g

  • 3 _" }0 L; f8 S: e7 `9 z
  • 3 I) u0 S2 K! @  u% E. q
  • ' C! W, W; o% d$ y0 q7 |

  • 4 F9 v: k+ B! u7 k1 H

  • $ J- i* |9 ^9 c# h  U9 `

  • ' R: n0 a: u( `! n; g0 x; C8 d* U- p, Z

  • 7 h: B- m0 p4 V$ p! ^; Z5 _

  • 2 r/ a3 \" g. i: e

  • % w" m6 `, ?" \: r3 x5 s7 M7 m) b; l" w0 A+ U3 i0 M

##绘制有海岸线的中国地图#引库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()1 J3 h7 e4 H  l5 E6 {

% H0 k- j% D" Z
/ {2 T1 R% }2 n8 i

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

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

28af454b4567839d9c888c0e3809708f.png


7 A% ]) R0 d) v

  • ) {& `0 f6 |: O( j/ V1 A' H
  • 0 L! k  Y5 l1 G9 T

  •   e) b0 ^: A+ S' y2 @& v
  • ) |2 m, S7 M& o. L1 F

  • + \  B- ?6 y* j4 v3 }7 W
  • 4 J* ~: R, a6 n; v" W1 g- v) h
  • + t, R0 o3 B% X: [" [! @1 A
  • 8 M$ R6 p, z% P# F+ A5 @

  • 3 U2 Y5 s7 R/ T

  • . ^5 v8 y3 y/ |  L8 e

  • 4 ^5 S# t$ j, d! g9 J! ^2 s- T  @

  • - C& C- d2 z0 C: N* \- F$ l2 K

  • 1 @# Y( k) e3 `1 e, @# I

  • 4 x+ J8 l  p- s) B9 m8 Q
  • / E  T$ H; R, C$ m0 e* Y

  • 1 j& I  O. I6 k' y, c
  • , I9 V0 E% e0 R% s0 d+ x

  • 8 L# T- _, |6 w" t' n

  • " e$ x& h6 c8 |2 ^+ F* Y' k
  • 1 R7 K8 }- K' @5 f% ^% [- Q
  • ( d) p; n3 o; D, |+ t

  • - p, p8 }( D: q! ]
  • : V) v- n8 Y# X% S1 }! r3 a
  • ) v' g7 y: |& N# M- @& j( T

  • : `+ y) J$ E' E" Y& t
  • ( Z- i, _9 R  T& n( z7 K

  • ) y$ j# N/ m$ u) x- x/ Z
  • & o. h" j% z$ q' F0 `) a- Z0 Q

  • 1 G6 |! s9 X# H$ r  A
  • 9 [# D( N* b. Y, n9 ~! _) c  b+ f

  • ; C( y' O8 w. R0 q
  • . j% T3 N$ D. `' C5 _5 _; ]& n( ?
  • ( V/ \- q. S) u& f. ^  W

  • 9 ?: w* ~! ~  g& O7 I, B1 x
  • 7 w; t5 r' k. F4 }! ~

  • " A$ C4 T0 c4 Y5 Y5 e. Q. m

  • " L0 N* C4 ~- n% i; M
  • + p! I! N" G0 r1 n- g* M$ c8 D, V

  • 2 Y3 m9 l2 v' f- v0 H; p9 m

  • 0 e, ]2 m8 K  X) o. i

  • 8 ~8 w% l/ x0 U; W. t$ {0 U5 J( }5 b4 s3 ?2 k1 X3 ^

#例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))
. s" M$ R! t, I3 f6 [; F' W. k. L! w

1 Z: G# u" ?: c


& d/ L% o0 T; T. _; V& J                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


$ Q! K' J) u$ _9 H  g

  • 8 o3 V+ q3 O8 w3 ^3 \

  •   k8 q( `# j3 \5 N$ @/ E* t2 g

  • ( B- R- g1 S3 \; R* f8 F

  • , z. m$ l* m- @- v  m
  • 3 F' Z7 O- R+ K& b1 y, l  o

  • 8 a" i  c2 a  p( u# _
  • 6 k  |3 Y8 [# g8 t2 n' Q

  • , j! @; h  s* p, N

  • 3 ?2 A. H# }: f- R* N
  • 8 C+ ^3 L6 X( m; f/ i2 z  f" n5 ~

  • 4 s4 w: r, M* D+ a
  • 2 e/ N. G1 D- P4 U1 \

  • # E. |4 F7 _7 ~3 W$ |
  • 7 r4 d& \$ q% z2 J6 X* \

  • ( O% P; _2 Y% k% C# z! X& P; z
  • 0 a( N5 D$ H  c

  • 9 b# ]  ?( V. @/ |
  • 1 P; ?; A0 X$ U* c0 `/ @' g

  • . u6 L% C* |, z; p* e+ `

  • 2 }; `, l% \, G( H: x! H. g

  • * n; q* {; W1 O

  • : r( _) J! i: b/ z

  • / R) k: g& N3 [6 J

  • 4 j$ r" Z, n: S0 Z& z( o5 q4 Z2 r- T
  • 8 x8 s8 a; q/ y  e( M; \+ x
  • / V2 s2 m8 `6 Q$ J; ]% J2 y

  • 0 e: F  g5 r" x' b  _' X( V

  • 2 M& [8 Z& \+ h- p* a8 w* m1 f& V

  • ( J" E/ S8 L4 C

  • 7 `- v$ |- n2 N. S

  • 4 B$ L' A. |( i6 s! }& _' y$ U

  • 9 g7 l3 F" o/ W0 n2 L! ~6 L8 m# y

  • 5 w+ G- o4 o& o+ C0 w8 l
  • " ~2 _: v. c# y8 M' d$ j$ r

  • 2 h0 T! c8 Y$ \  o2 Z
  • # G2 u% D' h3 t+ O* o
  • % u  z0 d. K/ g5 E  h  a
  • ) y1 A/ ?# ?  B
  •   B3 G2 R. L# L% X
    * X8 }. N# ?* i+ z+ a8 B" I- 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))
. I. r3 n/ L4 k( @


" e: m# Y3 _# I+ ^' ]; p. F& R+ Q" Q) h

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

; U: a7 u+ H7 |& {% Q7 @

" L- m7 x2 s' o; U2 t# Y
回复

举报 使用道具

相关帖子

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