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

    # t0 `8 M* s# o

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


4 I* x& K4 N( j4 t; r: E3 p                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • - u& N# T. B. Q- O0 `* e1 w
  • " Y" ~* F( u- t; ~
  • ; i& e/ j* u% l3 C. O3 o6 W" _9 O' D5 H
  • , v: i# N, `, g2 \8 e, f
  • : d+ i. X/ o  T  F) R' T
  • 3 ^/ `2 p; L$ [
  • 9 T8 J+ K, i" g' w+ q8 b( t

  • 8 W( ]5 ^! l5 s* s' W3 j/ G  ~: A
  • 4 u+ @" L" P, U* G7 l) d& I
  • / c" u4 d4 o# a- T" P0 L
  • , s  {) P3 S% Q7 J( a0 Y

  • ) C7 v9 f/ i" t$ H
  • + ?- |9 a8 |* @, m0 z& E# E

  • 6 I) @: j7 \9 J0 R9 I0 D
  • + M- ^! C' M: e) Y
  • 6 k. v/ r2 w& p) c

  • 1 k- O: j/ q2 m1 F5 @3 R

  • 3 [/ I* S' C& D) M9 u0 o) k3 v2 ]# C
  • ' Z% V6 i. j" Z3 w, O

  • 9 u" W4 J! n" t

  • ! ^" s$ {% j) Q6 m
  • 2 Q  z3 W, W% j" w7 B$ y2 |% J

  • 9 a4 u/ b% P( V* S0 S( @

  • 5 V1 I9 e0 Z3 p8 }1 [% j
  • . k' V& I5 ~7 ~1 l$ H7 v
    - H4 _; F% [- v( L& l8 n7 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")
- d. b; ~& D# ^4 M0 e) k) I) X2 v

- y9 e( t& l. a/ h, y5 X
, F/ T( p% M* }

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

* T. r7 J2 Y' s0 O* l6 h( x+ u$ x

  • - ?' J) k% T$ }
  • 2 Q0 n! a# C( |0 c+ t
  • ; l( P/ _6 M1 W9 `$ \3 f0 {0 E  e8 |

  • + i5 @: t# w6 _% d
  • 3 u% U1 Q+ o6 i, v' X- H/ f
  • 6 m' Y, F4 K) v; t% z
  • ) w  ~. C  D* p

  • ; g4 }* u5 ~& y; P5 e4 f+ B

  • 9 [3 `& J4 i$ y1 x, z1 x
  • 7 n( \" Z9 r1 k' s+ @
  • " g: t, [$ j. r" `( J

  • 8 j1 U& J2 W: W$ z9 E+ n  S# R
  • 1 P6 i, z: d" g& r7 e6 _1 I9 A' S9 x
  • ! m! g1 ]% @& I$ e

  • 0 i! `! F# B+ Q5 D

  •   ~6 c9 {7 g/ E, e, m4 J
  • % @& t9 |( \2 V5 h% F

  • ' E1 \4 x0 u! [, F, G
    # A3 E0 y4 e; D1 o3 Z4 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")4 U6 f3 \$ R+ p' Y

& h0 `. S0 @4 p  ]
9 B8 n$ p, L- Z; N4 `

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

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

f5c3384582002193c2c6c354a3d26729.png


; W* A7 K4 Z5 m$ N

  • 7 }8 q7 Y4 ^: w& {2 k; p
  • 5 w" {4 K% F# s
  • $ W; ?: m5 [8 R  {0 \1 e6 B

  • # H& W0 K8 c, {$ L& v5 p8 [1 ?$ _

  • / U9 B  z3 [& E, G
  • 4 e2 ^9 |) c2 a: E. i+ b& s
  • 9 [9 M# O  h, p
  • - n. T/ n, Z9 r) q1 L7 `2 d$ g
  •   Z* d* u1 M; ]" Z) w
  • , E2 {1 ]9 Y; h) L( ^, Z+ t
  • ; W4 r6 f$ V! m4 ?9 ]1 i

  • - o* c6 ^5 ?! ^6 J7 o

  • ( p! p9 l8 u8 m' n+ R9 F" i. @

  • ( V" y$ V: K- v, O2 `

  • 3 C& b! [7 C( l  B$ ^( |- F0 G
  • 3 G4 L- c8 d- m

  • + \! G) Q% r6 J  F" F" R
  • # l0 K# o/ A) g
  • 6 s2 d" |- o; o4 t
  • 5 R0 }2 m  A- I  x4 B! J
  • / d+ x0 N- c. \2 [' h! x7 d, ]

  • ; Q6 {# V2 i, x+ a. r: A& @5 P( P
  • % J' Y# n8 A) Z

  • % ]- B4 J9 }6 D: r& H5 _; Y  E2 h8 y1 G
  • $ @5 ]  I- T; g) ^5 W) ?# }$ m

  • # f: E5 S- h% w2 {7 V

  • 0 N" t" z8 J0 W4 F% J* Y
  • # |. v( x$ }5 B. Q/ }7 C: C

  • 0 F! I8 r- E  P7 v1 O/ ^- @! X

  • ( n6 L5 Y" i: c5 T1 ?& H5 b8 G  j" d/ y
  • % J' e7 O- L1 W  R3 E
  • + N& b9 k& O8 H& W$ M
  • 0 L  Z. y; ^' Z$ h

  • # B/ J( O7 k& [5 T8 ?
  • * N, M* c( ~, F0 C7 r. h- q

  • + Y6 g4 X; x% w3 t4 i1 ~* m

  • / \  d: R2 G- z; P3 Q
  • - ]8 H! x7 Z3 Y% j0 D8 K/ x! O

  • 5 _' y* T, y9 q$ ]

  • , O; B4 b4 J9 }- d/ j0 y
  •   h  p% N: y" ^( c* Q" x# ]
  • 1 d+ v) i) T* D/ Y; m3 J, A2 E
  •   \; D4 H  r3 V% D* E2 @4 [
  • # Q8 g. _( x* s( N

  • : L7 [( \) a8 p0 }# L1 M4 ?

  • 1 m$ N. r7 B( f8 Z+ V9 k/ B
  • 0 ]" N% h6 D' G0 N; M  l" o
  • & L; r' }# a+ S3 ^6 z7 |% \9 M. V! ]

  • 1 V( J) O& k8 J* J# d# ~: U
  • $ h- ~! K! X5 @8 t4 D
  • - R# U7 R0 f; B& V" i$ D
    ! {, K- ]8 Q# L; L# w' m# h( i

##绘制有海岸线的中国地图#引库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()4 Q% b' u2 {- H5 L: v. q

' `, [9 N, f& I: T% \( \9 \

) d4 ]/ V% _5 b/ g1 E, M; Y

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

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

28af454b4567839d9c888c0e3809708f.png


# s# M# X, A% u0 ?

  • , z: Q2 t5 s. }* P7 o. t4 Y  j
  • 4 I) e8 W5 t0 l, M3 c" [: Z
  • 8 G+ I+ c# t7 N! ~; m
  • ! W9 {) t" |/ X6 J6 a5 B: |

  • , K) k6 p6 u3 j" Y
  • ' J# ~3 {. b/ Z# O
  •   u7 F) M& @. T5 X# d4 l
  • 7 w4 `( h- x- {* x$ G1 E# n. H  E1 q
  • # W; A! }, N6 j& {
  •   Q" B0 h7 f: M5 C
  • & w4 a' ]% i  c; C0 {$ S' `/ `8 g6 D
  • / a7 g$ B% J8 d) A/ K2 j! K1 T

  • % y' T8 K' z7 e) r# b
  • & s9 y' h( y, s- x2 X2 w2 }' Q0 R
  • " P$ u9 w4 i- V8 X. {3 b
  • - c: ~9 Z; ~) Y; X

  • 0 ~& L+ q* ?3 I& r. s7 L# @* S  Q
  • 6 [- S% g; N6 |" x9 c* ]1 \+ g
  • 7 I7 B  p: m# ^) m7 d( g% v

  • ; O4 U; y& Y' j- g/ f  a5 X
  • 3 j9 g2 p& C# }; S
  • ; i  o' q( d) z& A. Q) d1 m: I
  •   F/ a  X7 u1 u7 S0 b

  • + K) ?# R' t" B- c, X
  • 6 z8 x8 k6 z  x3 v! y: W
  • + Y% I; D+ m7 ]5 E# v1 F

  • ) x. i7 H' ^+ Z

  • 9 X  d' g+ a" q6 d3 _2 d
  • 9 f# E* A; b7 r% Z

  • 8 r# |; u6 d/ q  X
  • + ]* I/ h% C9 F

  • & \% D! Y8 U8 k* l
  • , k% Q% y2 B7 \" J7 o
  • 3 {4 P& S; E8 I( s

  • 0 ^' U, Z+ {1 |8 v

  • $ M; y$ C- I8 ~; k) `. \
  • & X) s7 }; O$ L7 @! `6 p# F
  • - V7 |( T; c* A6 w
  • # Q; u4 d$ L0 A1 w2 W5 _

  • $ H3 w6 O0 z- x
  • 0 I8 {& l" z! a" p
    2 a+ k2 w$ ~4 X! A2 o% H0 T

#例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))1 x) l; P( ]( _2 G

4 a$ [- N, B; M0 z; B

  L$ Y/ V0 i/ {
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

, Y8 o3 z; |; q) w% v) I

  • 1 t5 s) d1 z  c5 q7 Z8 t) W6 f
  • ) E, I7 T1 c& r1 F
  • & I/ X% z4 a" ~  R: q) t  X
  • 0 b. P- P& X9 o7 @) e/ v
  • % V5 _( {& v- O$ G
  • 8 Y2 ?# i2 H, |6 S

  • 3 ^* I9 `5 x$ o
  • 1 C. X2 b: i1 y6 d: w$ o+ g5 t9 v
  • 7 H  |# D0 W' [, _. U1 n
  • ) y9 X. ~- s4 j6 b6 \( Z9 N

  • 5 _& r* c; t8 z3 c8 _
  • " M( z$ z7 W3 {+ j9 P4 z

  • : g! F% N1 I/ y- x1 Z

  • * h$ U5 t/ m( i/ D

  • * \4 t% A1 @/ u8 R6 z
  • ( H/ I( {* e* q4 u  \

  • ( Q$ O) M( g0 M4 L/ ]; G
  • $ C! H# G1 n, s4 B

  • 0 N0 j( h. [& z( J3 O" E  ]
  • 3 f. @  C7 _8 q$ P
  • & z8 y' S* R  t  p8 B6 A
  • 1 J# I' f+ h4 T) r& ?

  • $ d+ i7 q4 j0 _1 q

  • # P' ?$ D1 J) @4 M

  • 7 H6 @* u1 c; g

  • 6 n! z1 M2 R# K  w
  • ; x5 b" M4 ~  V' {: V3 K& v
  • 9 H# O$ J6 i0 {

  • ' D: J: k* |: I2 F* a# U: D& F

  • & I& W( p( r# Y; K- x, A% y3 R' b

  • 6 }. ?+ W8 B1 k9 j" ]/ B
  •   y8 v. A0 W4 I
  • + Z. e% u: S) j" i

  • 4 }! M( \7 h% C" ?" r3 X

  • 8 N& t7 A0 }2 @  N
  • $ G4 K" @2 i& K0 H

  • & v2 ]8 T  D9 V5 W3 c8 @' g
  • 1 B2 o5 c) w7 ^& h) w

  • . a! ~7 Q6 H) V9 ]& V6 @: U2 q' F- [" P5 h

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))1 S1 U8 E$ K( F8 d

  |4 z1 u+ X  V9 U) e4 b
5 b/ n0 a* I" h; c

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

. t$ i9 M+ P  {& L" L

( s7 T0 e6 E% |3 r; S' |5 H- Y) z, E2 [
回复

举报 使用道具

相关帖子

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