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

    # f1 A* G. I( U! h/ K1 @

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

" R7 S  i- |, ~( ~0 w/ M2 S& E$ k
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png

  • ' X; |3 Z3 U6 `
  • $ F- }; ]  e0 t9 F7 \/ u! Q

  • 1 P- c# v9 q( o* t

  • 1 G% i& S. C+ a+ m
  • % \# h$ b% U0 ~. v

  • ) d* ^) L: }" p. s1 g6 a0 o2 c+ p
  • ' _  A& Y0 p& k, O

  • 7 k* M* j! D7 P) c
  • 6 }7 w& Q3 {# D  e: _  r6 j8 m
  • 0 U9 Z  v" p0 u' W0 y. }) ?- M
  • ' X2 r9 [$ n1 p2 I
  • : y! y2 C6 G$ D) f+ J. q/ U$ a
  • 2 z0 B( @$ \- N5 C

  • ' t. E6 \' R9 d( k5 A+ W

  • 2 D& F8 ~' ^; v2 q- g6 x* j
  • 0 k  @+ Y, j8 {- A) m, K

  • 1 t& E9 P# f8 H7 j3 H2 C! I
  • . `; `( d- h& R; a2 |! E5 W, y* C

  • 0 p' p/ x) c% F8 {5 o1 j& }; a

  • - y* k0 H5 j! |% f! b/ s- ?: R" ^

  • 3 i) J* x9 \9 T! R0 X2 {

  • : e1 t3 s9 J+ `( z
  • : f, x, H2 u/ q( C! d  Z4 S: P8 M
  • 8 j/ t- C6 Z2 o
  • + m6 y& F) D' g9 O4 }% P& P

    5 K# o# l. }' t  f* r

#绘制中国区域基本地图轮廓,包含省界#引库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 v, n2 }( W8 l8 C9 r4 P0 b


9 J& V3 t# `/ H. C3 B( U& a# r
, M" l: G  z- M3 V

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


8 ^/ s6 M8 C7 X* a, B

  • $ p0 n8 U# B+ M
  • ; K% M% k2 _8 w6 j) H9 E& s
  • 2 V* g2 \7 U" M5 u
  • ' z/ E3 z+ e+ k6 q6 n! ~
  • 7 R: R% N1 a2 F( Y7 f  i8 ]6 M: _

  • * N' B/ i, n! ~% z# C7 K

  • 4 c# F! w' [- o. R" Z2 H0 ?0 w
  • : Z% G9 f' a( j  v+ _

  • 3 e2 y# e9 S" G# u/ [

  • : x0 k( o4 D/ b5 O
  • , m: }" i3 K8 u/ e1 |" v$ A1 E
  • ) i8 [5 K+ \$ \* j
  • * X1 ^  e4 z# B0 G+ i' d
  • / I8 k& j- y' _/ B% a4 ~

  • ) _4 d( x5 _0 c% f
  • 9 W+ v% G! P0 I+ F' Q5 E

  • 4 Q( ]& f! w9 h, \2 {$ L

  • 1 }* E% V$ O6 {  h/ U8 f1 @! l& p  x

#绘制中国地图,并标记各省会城市名#引库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")( `7 J9 L* G9 W# s3 Q  y7 S! _+ N, R( j

2 V, i. U+ y* Q  H! @

1 U9 V: V  D( ~+ {

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

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

f5c3384582002193c2c6c354a3d26729.png

) @) ]7 l+ o" N+ _1 V& x$ D- s

  • ( C$ m0 @! N  @

  • 5 l% {; @5 o, i% Q2 U

  • ! Z4 A$ s& J5 Y% Y: y, }
  • ' H' `7 k9 ~  L9 A! p# i& x3 ]
  • & C7 |+ k, ]4 I5 A. z, v0 U, i8 E

  • 8 z( [( P0 @. n9 K) a8 V* T, f' a

  • , W' W8 p1 P# l$ }* `

  • ) o* ?1 v/ v5 u- W. Q5 a; H$ g

  • / l! _# _, X, N  b8 [& Q% [% B
  • $ v& D. t$ \4 d3 A3 @: N8 b

  • + E: F/ i+ }8 I' k
  • ; k) a1 ~0 ~; c4 c# j! S
  • 2 J/ h* |4 E2 x  Y/ U! p
  • + m' h5 s% P* C
  • ! h) q. j: s3 ?; a  _

  • ) ]4 B" e0 V  {& I  O2 f3 k

  • 2 f- {! ?6 Q4 g: `! q; `

  • % d1 L) q$ D# @2 [0 E8 q  c3 q
  • 5 A' K# O+ @, Y9 @9 ~

  • 5 B; S6 H% G1 e

  • & Y4 F6 {  z4 g% F' T

  • 6 y9 B8 K* V) b# S9 }- x! z

  • 5 h( `* ?0 Y$ B' x
  • ( n' L$ `5 x8 R3 d% X

  • * g% ]# V* n2 ^' [  z& W$ u

  • 8 K2 H2 _$ `9 `5 U: h
  • ; c, [; F9 Y( g! B" K

  • ( o7 E; n8 Z3 u3 R9 Y
  • # c) r6 I6 t2 c6 V( y1 _$ Q3 _7 k5 h7 S1 {

  • 1 d6 w2 z; [( c% Y

  • 3 d4 y, e1 m. }; [

  • 8 ?* Z' X( N4 d/ `  K) @6 L

  • # ?% ]: y( a. @( t" ?! J
  • ; Q4 U3 S+ }0 y* I& I" A
  • & ]9 L) H$ Y* e0 H
  • ; `; ~6 V1 F8 m! m$ v- n

  • : p4 C( a0 f; Q. P& C. ?

  • ! B' h3 D: n# R! Z! F) |
  • 4 P& `$ ^- i7 Z: J$ Y1 j1 G3 y

  • 4 }: _. c% x0 Y  U9 k: l0 q
  • ' T0 B0 H- p" U5 U  f% w! S4 C! A% c  j

  • 4 w% V+ t/ N: y2 ]& A

  • 4 d1 F6 B8 D+ M7 E

  • * p8 k6 u% K" \+ k
  • * ]! d0 g0 B% i1 q

  • ( B% d3 v; @, \! i

  • ; S6 k5 c* K3 A- w8 k! x' e7 c
  • , y) W+ L+ C% W: p. [
  • 0 c8 ?" i! A" D. e9 D# G
  • 1 ]" y1 @: V. M# f- w9 t

  • : q! s4 _  t. a1 @. m$ o7 k
      U( H5 M" ~/ D8 o2 }- ~

##绘制有海岸线的中国地图#引库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()
  Y1 ^3 y) [) J1 W$ z; c# B


" K& ~$ u2 C& Z, Y; F$ T) k. h( d) E  P) }3 o/ ^3 V$ O

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

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

28af454b4567839d9c888c0e3809708f.png


6 c- r1 a6 g' _9 s5 n
  • 4 b6 ?3 K7 r' r& v# O

  • 8 Z& s( _: \: T

  • & R3 I0 y; B3 w( x' Z
  • ; Y4 B2 l0 Y2 T/ R4 ~8 h7 U8 h: ?
  • & Q! F/ o) V/ u9 f# H+ I
  • 1 \+ J. @. ]$ T7 _$ J
  • : n  z' r8 M% O4 a

  • $ r8 R7 u( f8 F
  • " T0 W9 Q, g; S* C

  • / u' L7 Y. \1 t
  • 8 n4 K# C+ j, i1 I. ^; S
  • ( w2 ]8 r8 r4 I0 `# n; ~  l* G% T
  • 8 d% t! [  ?7 h

  •   @4 r7 H2 S/ K. ~% ]

  • 5 P7 s1 [; m+ h5 \. M

  • : ^# K6 m# I: c

  •   \8 t$ c$ g3 B2 ?# K5 I) D

  • 9 i% P, ]; \, w% ~1 U
  • ( Q8 u2 r& x! ]& z* |( g

  • 4 z3 I2 A' q/ u0 _. Z
  • 9 U6 F7 ]1 K2 t- Q" i
  • " v2 i: h, K$ @$ g. u. n7 b
  • ' ]. J2 B9 [3 I) k, F1 ?8 u

  • $ o6 x: n2 q  Y' x- ?2 ^
  • 0 I1 Q  {: C2 `; A7 f; L
  • : n% p: O% k$ q. f7 c$ M% B
  • ) i1 g/ Q5 T' R. C$ }9 O, }
  • 0 d) Q' D* O3 x
  • 0 G( z8 w3 A5 y! b4 f& X" s$ y

  • ' B$ w6 r4 |: t( J# g, y$ \6 @

  • 0 u2 \. H0 ~* ]6 l& D, P
  • , I" [2 |/ X# B  f& C8 ^- @
  • 8 O1 ]0 w" g& z1 w9 o+ d) z

  • ; r3 H6 Q( ]1 Q

  • * x4 ~; b* ~. ?% ]4 E
  • * T: z: x  w6 i1 s
  • ; G! f# L2 a" s: |8 B

  • * d( n) ~* T4 D: `

  • ( I' d& d- N* J" l+ Q3 m0 ]* K

  • & \- ?  Z$ Y5 k5 W0 r/ K& U
  • : K. h: H5 G) u0 c# m, {5 s
    - i1 @; O$ E5 {. 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))
8 z3 U7 @' y4 u* x0 M8 s, f


( Q# a# \: ~; S7 c# g6 ]

! n; M4 u# g- ~" Z! j) [& l- e
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

8 U  [1 \' z" {
  • ! u7 C3 s4 g& d: Q  ~

  • ' O% G& j) u  d. \3 q4 l/ j% f

  • * @0 l/ D# X9 e. l
  • * U0 m* r6 a  F$ u

  • ' }) `+ z* q7 Y) J9 V

  • 7 `3 |: [+ B! x( M7 U# }

  • ( ~/ T% H3 j, X( w4 N, p

  • ; r% j) V0 U3 ^* O

  • * f/ p3 N! e9 t& o" \6 w
  • + f+ M- j; L  y9 x

  • 6 D1 o/ z, U! B- b( Q$ Z
  • - i8 ?2 ?  A% J

  • * m+ d8 i& j/ k7 i* ]/ b

  • 5 z& s# k" k- d4 H

  • + q7 i8 r$ m; _$ |9 }7 p

  • 9 _$ ^' k0 L: i2 g+ @3 ]5 f, p
  • ; ]! U, C$ P( [7 U  A3 ^# i3 D7 D! w
  • 6 G9 k3 ^! f: z5 Y) d
  • & L  W- y2 a3 \
  • ( D3 B/ `" @$ s

  • % Z* [; H4 P! E2 i
  • ! W# S3 \+ {! B

  • 2 y3 Q& ~( C+ R" r+ v2 b
  • ! l, O# `: l5 A9 D3 y

  •   b# t" [1 d6 ~: a8 L
  • 3 G% F2 l( U5 }8 L" P: Q
  • ( c# r+ M0 N1 c/ ~$ H. i( w( {5 D9 Y
  • 4 m8 W1 _/ h) Q( H. a( ]: _( s: v
  • 6 [  n, O4 ^1 C! m% q  p8 N

  • % |$ t: w" m3 h# I7 t) w

  • 4 T, X1 d  [: C" L; B4 W- |
  • 3 W, r1 O2 P9 C- g' s

  • % d8 v; A1 B" p; z

  • / V9 W/ c/ d3 i" H
  • % m9 X0 j7 L$ o; r+ {
  • 3 A+ ~/ D7 z" l" \
  • 8 l3 F& k6 @% P( _

  • 7 Z) P# o/ x3 g1 R2 z
  • # X! N; U0 W  [- E1 ~7 Q
    - \" p, B2 ~0 }* ]

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))
7 y2 U8 W3 c# o3 r# C


4 z: B0 o- S+ S( [
+ z/ |" Y( o) n' N

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


8 v5 m5 P3 _! P9 t+ T  R5 e0 L& m: {7 m$ x- K/ M" t
回复

举报 使用道具

相关帖子

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