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

    5 P3 c" g- i, U! o( l

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

: r& Z, _- L. i2 j( [
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • " [) B" d6 b8 ?6 P" [) Q4 `
  • 1 W! p/ r9 J2 [" L. ?
  • 4 Y7 t# X8 N% Q: C: k5 ]
  • # e' e# c7 t# O2 v# P. T3 m

  • ( s+ e  ]" N$ @: s
  • ; h2 U5 O) C( b: y1 U: `

  • & n" I2 a3 h; T
  • / U9 |- G) v; d8 V: m% j

  • / E% x; J, ]4 K  @% N: j: b2 @

  • 0 I) l; F/ M( G

  • 5 X5 i3 ~) r4 |

  • 3 a2 x7 L4 K- t) I. j  h; T' q) F

  • ' J- e# v* `5 Q7 `

  • - Q" l; e; H7 n1 ]& \/ e3 V% @& o
  • , ]* j8 u! p" V/ Z/ i% E) H
  • ' m+ G' e9 L8 [0 D- h  ?8 @

  •   h" b( C5 L' v, l1 |0 F
  • # I5 [7 f& |4 f3 x* v5 r0 u; E

  • 1 B, [4 w4 U; G/ p2 U

  • : H1 u2 c* U6 i" D; y; G. K; O! Z

  • 9 |! O, }& R  Y7 X: O6 K( D
  • * `+ N1 F& C# O: C

  • 4 v3 {! \4 G- N, A* m( z
  • 3 X5 a3 _2 ^9 r, p5 \- w" f

  • : T& N' D( x4 j9 N4 q) I( V5 N$ B4 k4 Z2 j: h9 O% A: z, d

#绘制中国区域基本地图轮廓,包含省界#引库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")
& X' `0 h( \: I0 b+ _2 b0 m

0 ?5 e5 J- r! `9 {. I4 ?1 @- ?6 c5 \0 B" o
6 S) q% v! \* x: n

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

8 N$ S8 z* F6 V5 t* P* P3 f5 c* u
  • / h6 {( s* O1 r; P- {) e5 a

  •   c8 G5 G6 ~$ h2 [
  • $ S" l0 {* p+ z6 V( z

  • 3 @) q! O& u/ ^! F/ l

  •   U1 o) i! n1 O$ U4 S  f! {$ I

  • ; h* b4 g5 T% h/ Z9 Z0 A
  • - R9 p4 L( P5 [1 \! J8 C) c
  • & o2 L) C5 h, i, Q" b# P  t7 y( N
  • 1 G6 ]8 [8 n* Q( K
  • # i. i: T5 B8 u, c- f7 C

  • & F; s5 T/ W* l1 g, B

  • 8 w9 Q* _* b% V) d9 |# N
  • 9 l9 |) T2 V( Q9 y! C/ |' p

  • . J  E' n" P! J
  • 3 D8 }0 `0 g6 C4 Q/ K0 N# {

  • + d$ P3 s3 j* @9 U) e; h

  • ( Z6 q4 e* N8 t8 x3 i. B3 N. i
  • $ I: R. i% F- H7 {1 m4 _0 k

    0 a- X, j: b2 U# m

#绘制中国地图,并标记各省会城市名#引库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")
. G: m, y8 D' ^1 Y) x8 Y, v; u

! Q6 B: |7 F3 \* h- e

+ {; s# a6 q% F. q

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

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

f5c3384582002193c2c6c354a3d26729.png

* P9 B2 l) w6 {8 }! H* {

  • & h9 P+ `) B1 }; [; q
  • ( u# m9 K, C9 ?! m& `  I

  • / P1 M! R' K) M" z) {" y

  • 4 t+ \' W( W) |% _: G% P/ F. W! d

  • # K4 {3 S  _' ~- h4 S

  •   V! A3 I0 H$ g! s# K8 L
  • " ^6 J4 H! x7 o

  • / A9 i! q" L9 t" t$ ~
  • ( D# E' s! |) Y4 S/ v. I5 v( g
  • $ ?2 g$ z( v* k) |9 ~
  • ' r! F# H; s3 P4 t* `% i
  • 0 l5 c% l. |" u6 G6 l1 ^: q, d

  • 2 [0 s4 `  Z0 n
  • # o$ N" G9 y! j& N
  • 4 q- D: i2 R) l5 A. D1 u& S2 H
  • ) X% ^" b- j' ~! A& z1 y9 [$ {

  • ! Z' h0 p9 x, U+ \

  • $ J- A$ Q" f3 y/ c/ p

  • $ n- d+ L0 F7 N6 B$ }7 ^
  • 6 r9 r* z# O' Z* q9 F& o" G
  • $ d: s. V* O& ~, A7 Y/ k

  • * s- ?' b* B& M" A5 N

  • : L& d1 l* h' S* x% e" P" W

  • : G: X. o) u4 w0 V6 V3 Y4 |& Y( m
  • 6 V. x* Y: l0 P2 m0 G: r
  • ' F, U: k$ X' c, K( D+ G- y: Y3 u
  • 3 B! R+ D* h/ |" U

  • ! z9 R# `, L7 {0 ^/ M

  • ( U, l! @& ?0 t# G) |: n; o( f4 c

  • 6 r2 C% `, w0 x2 O  d- I# n
  • " d3 N/ L( I, G  o* G
  • 0 D% j% g/ E" [# g

  • ' g( y) e) y/ K- a* |3 z
  • & w8 L& j% R: X0 S

  • % C8 \3 z5 g! K
  • ' Y( I$ j, V1 y. a$ l
  • ' J9 a9 r8 b* e, C
  • 2 ]8 A" i% Z3 @
  • 5 P1 y( N9 y, C* c' c- J

  • * \( g( M# E/ z8 Y  E3 T

  • ; D7 J6 M* h; _# D9 K2 Q  B

  • ' E+ n$ ]/ y0 a6 t

  • $ h0 I5 R0 j! n( X  e7 N4 @- v

  • / j2 ?- c7 V1 @  ~

  • 8 e& d0 l0 b  V9 P* _

  • 4 [4 N: P0 r7 j7 u+ r/ Y
  • $ C" c9 j2 m7 S1 u
  • 2 p3 ~1 F* }/ F$ h- L
  • % ^' r& M* H3 B$ E1 a/ o, e3 @
  • 6 M7 N! W6 p# ]

  • & a& W7 `, e9 S6 `. C6 Q3 B% w  J' b  k, @3 n$ Z5 a

##绘制有海岸线的中国地图#引库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()
/ q- ~$ o% X# E0 V# M2 Z5 y


- V2 K: b0 r% Z+ ~  c/ s' v( j* g6 A

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

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

28af454b4567839d9c888c0e3809708f.png


$ ]* m6 D4 P: H
  • & c; E2 @& b, z/ j% s
  • $ D$ r9 ?4 |0 T8 k

  • 1 u/ a& V3 M. R$ V8 g

  • - w  Z" v0 k3 v6 R0 @8 |
  • ) U' w/ h1 s2 L5 S7 o. y0 J

  • $ j- M( W' f8 @4 y: K
  • / K1 W0 V3 |/ K3 D% w5 ~4 }

  • 2 q. B5 a% ]1 O9 i) ?0 d

  • ' |, u4 R' c' i: j
  • 7 v- q' g( Y& ~- d3 ~

  • 0 m4 l$ P; B% ^( |9 W
  • 3 W+ @! X* H/ {) W

  • 1 G' R  d2 J+ _% X" }2 r% u  W/ V

  • 4 n' n, R3 w0 P( `6 u: m
  • 8 Z/ i% A% D5 e3 p7 R: J4 U
  • 2 x1 }4 H. x3 l/ X2 f/ G" i
  • $ a0 s; F9 J$ [( |# @, K

  • $ \! E- Z0 t& x# t2 R
  • ; m' H3 N. ]0 _3 A" e
  • : y/ q+ F( I6 V/ ?( E

  • - r8 C8 }8 w; b+ k+ M5 w

  • * M6 k5 r/ s$ O# \$ e* ]

  • ; f4 f& V" r" W7 z* e1 V' l

  • , m$ K# T: S: [: B8 J: {* n

  • 8 W' _+ ~* l! k' H1 u

  • ( S1 X, q% g' {4 B9 O5 h: L

  • + |. _4 |( p( z, d" p* T1 s% B

  • 2 b, i  g2 Y+ K9 m6 r

  • 5 B6 V( J) ^; N/ l+ o

  • 3 z& {- X) Y) a3 x; x$ X

  • 2 t, a. F& Y, ^

  • ! P* i+ n0 n. C& N& D2 G
  • ; Q1 G4 l  ], a; F% d) }- p. E6 k

  • ! J1 v9 R2 _' N  o- u0 ?
  • + q9 ?, M% ?$ U: f+ o# y& E! X
  • 5 V/ f+ ^+ m2 _5 d
  • " }- Q+ z6 o" Y: g& P8 l
  • 0 w$ Z( D2 k6 Z( R
  • 2 O4 O" P( x2 E
  • , ~0 n- Z- v& ~2 f: a* V
  • 3 B2 Z. ^- V" g; h& B
    ; B, a5 k! E. g1 s3 \7 F: B" _

#例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))
/ L2 w9 U7 H4 ~' }3 E+ @


3 H7 h" `9 k; Z* w8 v( [+ C! {' E


# n& Y% b  a" F                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


* i) Z! m( g0 A+ |$ y
  • 4 M% U( c, S  m$ y
  • 3 H3 W5 C( |* I

  • : p; q- W: F: L6 M

  • * _2 {$ `) {8 x6 q: |2 n" Y
  • ! q7 ^5 D2 i3 v% H' |

  • : l/ _" w/ X/ T1 l8 a$ R7 h) {

  • 6 e" N0 C! i# g3 h- G0 `: [
  • 2 c  F+ q' Q, B" m, {: d
  • 6 }7 N3 B( u' V2 z' H, u9 {( t

  • / ^- |: t! q7 ~! N

  • ; [. ]4 ?$ q5 m: h
  • 4 v/ ^# |6 B& I/ T1 G- `6 `
  • 2 s* y3 g' o, t0 U' g

  • ) J4 Y; F4 v, L. v* N

  • 9 q* p  V; v+ ^$ `; U7 m% }
  •   U; O# F2 T) u( H
  • ; f: j/ n$ W! K+ g3 I" B  P* V
  • 6 \) Z9 P: Q6 r, L- n
  • , B+ c# o# e, L8 }) w! s/ I
  • 1 O6 v6 j% y( C) i  F& ^7 h
  • 1 c: W# j. g: D- [+ R6 o1 D

  • 2 W! |) j  D# M" E* T5 P* U" b
  • 9 A! `, H' E1 M2 B. J2 f

  • : j! [" @0 L2 F, F# ^' D( _( v; m7 u

  •   }: j% [2 T7 ^- w+ ?5 ?
  • ' _( v- L5 o5 u1 Q% i' a1 ]

  • " f% I' I# M# }" h

  • ) a1 i. ~( r( T
  • - @; Y1 H' }( |) l! _
  • 5 A& J5 y+ t+ L: e: m1 U, d* d
  •   A1 f! n/ [3 s
  • + ^5 l. l: T- \$ u# S0 {
  • & V) L" `+ o3 i- {4 _) V% s
  • & ?& x5 _" K3 w* E% @/ R

  • / D: g0 X' ]& e) W2 e) Y

  • " U  z5 w9 ]0 ?' L
  • 4 R+ n/ e9 o* `/ \+ f- F: \4 J% F0 h
  • 3 Z% Z* ?# [. c+ |! \: ^: s
  • / `3 v8 J/ X' z9 A' c2 n* v
    1 P% w& J) |+ V1 O: a5 }7 m

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))9 y' X5 G1 k4 E8 j% L* ^% B


* b7 P' c* d! Y3 Z* i
* h8 t, p* o: r, O5 K* O1 m

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

# J8 B9 ]& c( K& `$ [7 n9 M

5 C% ~/ [4 q; }" F* G; }0 \
回复

举报 使用道具

相关帖子

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