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


    4 n, d' f' R4 N

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

& e) h& |/ N! I- K) d" R1 s* [* ~3 i
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • + r" w, L! ^0 k+ U3 F

  • % ]5 B& E" G4 u( x' s4 p

  • 1 o9 J  V) ^2 A

  • : K" f; H  x3 q* _
  • 0 `- o9 [, Z* c+ c$ d# t
  • 6 i" L. p' n+ c! k7 C$ }' e
  • , Z# c1 y  E+ N2 Z7 G0 I
  • 2 k% F! K2 z( n6 P5 O: H* i' S  h

  • % S4 v/ ~' w% a) ?' N
  • + v3 T- j* F/ C' Q5 C$ [
  • 4 U; E+ V) K6 x  I# t
  • + K0 N2 C& f1 O, _/ C

  • 1 q* |& z+ X7 m# L
  • - i# Z' F" W7 j" \

  • ( {4 f6 b" v5 S

  • . t; T8 b1 J' J1 o
  • : B" P. [" ~1 h  W6 o* b0 P

  • 8 J6 a6 [) {* ^

  • 5 U+ j/ D! M9 z  ^. }

  • , w. j$ z- I3 T8 f1 ~
  • + k5 D. S  m' i3 S0 K1 ~( ~. z

  • 4 b5 t" c' g, O
  • 5 a; z# k8 d" j
  • % b2 K2 h8 Z& W. Y, @1 ]0 S9 g' V
  • " M, x- Y4 U" `& G) _( x

    8 P0 [: e( {; @/ b- |8 f

#绘制中国区域基本地图轮廓,包含省界#引库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")4 X. V' n' U- k8 |1 T9 X


6 d9 V! {1 |" e6 x1 \/ W
6 [5 y- w/ F% t7 F

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

+ V, b1 T( y0 }" A$ g8 Z1 u
  • 5 _; D3 a# A: l( b, n' w
  • " L& h( q/ y: M" G! a# y! X
  • # k) y' Y- v) E: n9 O
  • . ^: W# S& Y3 n8 p8 o/ p5 u) T7 ]
  • . A0 g1 s4 H+ W0 T" O. n
  • 1 M9 H* }1 Y9 t) t
  • 8 A& _3 P- W! g5 F4 f

  • - c- y5 T# W  ~% w+ E1 Q

  • + k& e3 c, s4 K, U' m# B( c

  • 3 j% k0 e2 N6 j( g

  • 0 _4 y1 P6 N# T0 k
  • 9 @% p  z  C6 T4 V( I8 M. z; b

  •   Z' r- l' x3 _5 T

  • ; Z0 @& |3 O3 P" l! }3 H$ i0 m

  • $ q4 X! e, r) y3 ]# c1 [+ _9 G4 q
  • 6 p- s; F. [) f6 u

  • 0 ?9 a' x2 @, a1 \' l

  • 0 y0 A0 T. S; x- P$ C6 t7 j1 N
    $ p& l9 M) Q+ `5 z0 S

#绘制中国地图,并标记各省会城市名#引库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")
' x* J9 `  Q& m6 {: a


! ]. Z, I7 P' ^4 k2 e- H; p) O- Z# V
7 G6 F' U. m& c7 g( E" l+ ^

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

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

f5c3384582002193c2c6c354a3d26729.png

% c" y9 }4 S* X

  • 4 j! h- z5 C. ~

  • * T0 r( u# y3 |# h5 r! O8 d* \

  • $ o" w0 ~0 f$ B+ d9 _

  • 2 k. n  N" o4 {9 c1 P' v9 f+ W6 Y) I

  • 6 J; g/ o6 p5 p; U1 S' Z1 O# `3 r
  • 7 w: w7 w0 S8 M. p! v9 x7 t, p
  • 3 x3 Q9 j! a7 N6 T+ a$ E3 `8 B

  • - {* v* m$ C  Y; J
  • 3 e; c/ v5 c" l+ k

  • ' R4 j3 @0 i2 D: n" M2 u
  • 4 F! F" q9 d* D, `0 ]$ W4 r. X
  • 4 w: |1 \+ T6 U
  • 9 _/ j, u- b3 L" G
  • & S" L( S) e8 x" ^% ]' ]4 x

  • & N, @6 W2 b# q: N+ b
  • 5 [1 x, s0 O1 L) ~1 o: o4 ^2 k
  • : [6 I9 Z: ^; h- R6 R- P7 N: N
  • * i1 [/ {8 z7 C& R- g3 e  r

  • # w( h% s. X) \

  • 2 E8 d% O; D! F3 }
  • " A* T- f% }; Q: U/ a
  • ! A8 w' \9 X" E

  • 4 W; P6 n1 J1 w/ {! l0 G) N0 @% ?# T

  • 9 v) r9 ?2 t( O/ W4 Z# z7 U
  • 0 E9 z* [( I! ^3 ^5 s, X, a; k

  • % S# k  V0 K6 R+ {+ t

  • ( ]8 T! L/ Z; A4 c
  • 8 [9 A' V) i5 t
  • ; c' ?1 q: ~  ^2 l% B: h+ i7 H" M5 c. z
  • & r- u# f- \$ o

  • 6 A8 z: ]' h/ y" k

  • & A) ~1 m( p! J8 l5 v
  • $ \6 q6 ]0 K/ }) \3 w  ^( z& B$ e
  • & p, U$ B0 E( U, r8 X! \% v5 A

  • $ L) ?- A9 ^$ E. g# Q
  • - c; f3 d+ G; Y
  • 9 F$ z. C' O: `  {" P) I8 T5 p8 Z

  • 5 U% r% w  C8 Y! M6 {) ]% f6 e/ K
  • + u6 c7 \) {3 Y

  • ) c, a+ g% j' w5 c

  • 4 ^/ i. y4 i" g7 r0 J7 S
  • 1 U5 v( I; [/ z9 W; e* E" [) K, U

  • 8 ]0 `! ~& p+ f$ }
  • 4 E$ t3 C  h( s

  • , O/ N3 `, g' r, b3 X

  • ) l! p9 S$ K% F+ ]2 q$ {

  • , c  }5 ]7 d7 U9 [0 V# B4 V) o$ s
  • ' D0 R7 X# ]: z; F2 n, h$ @

  • # f; I! V. c/ u1 G
  • 9 s- b* \; z# J7 |( y/ \" d
  • # j& F/ e* l! \0 ?6 p1 ]

    + J8 v. H+ N" P  ?2 k' y

##绘制有海岸线的中国地图#引库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()
9 R, L0 L' y$ @4 H4 _. j& k) C


+ a" t; L+ m9 a
0 N2 M2 x* W$ v: h) ?' U, \' B% _3 O

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

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

28af454b4567839d9c888c0e3809708f.png


; ^! e& `% I8 N$ K

  • 8 H' c( B' L7 |

  • ! Y4 @, o+ b+ T& a0 G. @3 E
  • + L& b: [) r. b+ Y5 T4 e) U" P

  • & l, v' m4 Z7 P4 Q  W+ d" K

  • . }$ ^! @( v* K* A8 @& X

  • 4 J( {+ L( O1 d( N
  • 5 B) l% g( C& k, _8 F. E! M3 i
  • " V0 F, U: O. h; b8 z2 E; `
  • 4 q5 T+ `5 c; c: \5 x+ v
  • : V, [) W0 U9 l: A0 f$ i# S( ~

  • ( c4 ~: I0 K2 ^4 _& y* ^1 ?; N
  • / y; l" r8 k2 F( m$ z8 W; o

  • 5 o! R2 n% k3 K- m. a
  • : Q) U9 V5 N. X) m

  • - l1 z. O6 \, g3 K. Z0 U
  • 9 p6 M) Y, |. k6 B, }! [5 Z$ [
  • - {: m7 m3 ]! s8 [# S* _! v) ^

  • 4 W) E$ j( U0 I
  • - m/ u$ q. g7 g" R( G

  • ! O  f! ^8 Y" v

  • . u0 P+ n! W8 L  v
  • % y# ^* K, H( ~4 V) P/ [

  •   T4 f' f! n8 I  H

  • - t% e" a; L- Q, E* R

  • + p& }; K$ u" U" V# E: r' x, L

  • * S- ?  M8 g5 {1 ?9 S
  • / G* N) N5 w2 v, k

  • ' c" S# s  ~3 M$ p
  • 6 ~" V8 N, _9 s1 i( O3 p% V5 A% N' H' D

  • $ Z6 T) |$ N( s, |

  • ( \9 @0 c  s7 z$ {. b, b3 M* Y. o

  • 1 f; h, n/ \0 |+ R, m7 j

  • , l( c% B# m1 O1 i1 s1 y

  • ( g  T2 j# F8 a# _

  • / o( Y* Z. V2 D

  • & W" X  g6 }- `

  • & K' G$ n  ]# Q" u

  • ' n9 i- n9 |1 i0 p$ `6 E
  • 4 Q& ?/ [; R+ D

  • 6 D  r6 W3 Q+ H/ ^4 Q

  • 1 v3 E- W3 x& y) {( [5 n! x2 m1 v1 {( L2 G: b' I# 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))
; @& V4 M# @+ M! u* M6 |

- [9 r4 X: u  Z. _% R+ h1 `


5 a) ]- k2 U  ]- w                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


6 O2 L$ Q! }6 x9 B% J
  • 0 I. k1 x$ [4 h9 L) z- A% s+ B3 g

  • & _" G- n* V% G

  • 8 T: ?3 r( [$ B2 m8 j* J& p. P

  • + d. i8 O# X3 H
  • 1 ^- z" Y3 B  B+ A# ~0 G- D/ @6 I4 l# d
  • " K# _) J" Z- ^! j) u4 F  A

  • $ R8 S, e3 d6 `+ J" U
  • + W$ U( c" V$ |5 E0 \

  • 1 c0 n* ]9 U/ e  ^* @, }' X. k

  • ! Q( i3 U+ o; I7 w5 z  P5 R

  • ' ]1 q# m6 _" v0 X/ N
  • % P  E, d9 Y: f- P+ I. U& X6 d' J0 e
  • ( @$ X$ _! b+ x& `8 T, a$ ^0 }

  • " I8 Q, ]/ _/ O; H' f
  • % ^  s0 m5 V. ~! m

  • " s2 c4 O2 ?; N1 H& F4 Y

  • 9 m( m8 x" U# K- L

  • 9 T# |* N8 R% r' S/ e0 h
  • 9 N2 G- z# v# N# I& L, g

  • ) k0 t/ j& ~' W# H: q

  • # q- u, [9 ^8 u; q1 L- w
  • : U, S: n& f  n' i' ~. b) h9 F
  • 7 Y# L* V5 O" |- W( g
  • " E+ X+ ]2 z' l7 ~# u5 E' `

  • 4 E0 M8 H3 A2 N8 ]" D( k+ C8 R

  • + i$ }/ ~! Q, x6 _, Z) y

  • ; o' E' Q' P: H

  • - [0 }; d( O) h

  •   U" s* p3 n# a# S  T- s+ T6 I8 L5 [
  • 2 B, D6 g" T: C3 L

  • 8 D3 e- c; V6 e- O; d
  • / _  ]/ p6 _% S4 l, [! S" r
  • & `$ m* J5 T4 V+ ~2 |6 A
  • ! A( J$ Q" S2 b0 u. p1 T& ~# Z
  • & W# Q6 U: o6 ?, |8 p) x  B- J
  • . S% y. n. P- O. Y

  • 1 c3 {5 \) U/ X5 P- `' u4 c
  • & `. ^1 l/ y; s; }

  • 3 ~3 @% V. W- Q5 C$ |9 g6 e1 P1 [" l$ Q% 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))
. ?" Q3 i) y: P) U, _/ c% N


* t) h: X6 ?3 j2 K( u% A
' \4 i9 K" j; P

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


. @  n9 P7 i2 M$ C' W/ m
, G# t, P" |* z. A1 r! c! e" }
回复

举报 使用道具

相关帖子

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