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

    ( ~6 g* o  N. U% Z3 }1 T

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


# g# J# C2 n/ w9 l                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • " m% Z& d& {3 T

  •   J% R& f6 A2 |- p# p6 Z

  • $ u* i- d  r0 R, `
  • ; f8 K( ~0 ^5 ]( N3 c7 x: v3 o

  • / P. I% c+ \8 g; C
  • . y( m$ X! y3 d8 b; ^) p0 |
  • * Y+ B3 a9 [% r0 c
  • # |4 U6 F" W1 W( V( A4 O& F  _
  • . m, ~+ n: P% G! K/ g! L; ~* I, d

  • - G8 ?1 o! Q; \& O- T* R4 y
  • ! k5 X: i* I! \

  • & g) P' s7 B9 w# v- [$ ]# x( L

  • $ O' H0 ]! W% j8 `) v! M
  • 9 V  k) d. d2 U+ k" R2 _" {
  •   _3 e+ [+ T4 D) M2 Z, D

  • % g# `5 D" Q  [- k
  • 4 U- g: |8 V5 k' V1 a: Y

  • 5 z7 F' K0 S0 M' H) p6 v
  • ' _2 T, x( q7 D8 j4 |8 G; c2 u/ e

  • 3 Y5 O) W4 h- x' O! m* }' R( w

  • * L: J' ?" `: o9 L: a" W
  • : A3 }0 G, l. }5 ?+ a

  • ) ^' G% u% {; G4 X9 j/ Q6 R8 c

  • 4 Q( G3 P9 D2 a3 i/ s
  • / F  E8 R" m& a! T: w+ H: \" }( }
    ) W6 J# a$ S2 N) R: {( j

#绘制中国区域基本地图轮廓,包含省界#引库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")
: n% S+ t. O' U6 C


3 |, [" ]1 ], u1 I$ Q
- {* F7 u# `6 a% ^

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

! m; C3 E- u) z, H5 B- T

  • 3 j5 F+ O) y& F0 L+ [8 |

  • ! k( _* l/ U7 X4 ]' l
  • ; h9 X0 _/ P) q$ W" x  j5 t/ x

  • 6 Z7 x4 w" [8 _) N1 s5 h  x1 E
  • . m- f' d: a2 {% F% v$ C7 L1 B9 t
  • 8 P- K& q! O! t2 M- A# v" p) G, |
  • - o! g1 e, r( u' q. A8 U% ]$ l
  • + \3 h2 K, v9 ^5 n; T$ V8 E
  • $ q& b; R: E  s: C" M( {
  • - ?8 V0 x9 H( c, N# |3 U
  • 9 m0 j) r& t; Y9 l
  • % C" s1 H. |3 e% h* x

  • . S1 d5 ]9 M7 F
  • 8 V! H# n& x( q

  • 1 K* D4 H& ~; y8 l  o
  • 8 s+ ~9 `1 F2 Q0 I

  • % O0 ^5 Q! ]* W! l  Y; ^
  • $ o" y. b( F6 {* T6 v5 l

    & E5 R7 ^1 f7 o

#绘制中国地图,并标记各省会城市名#引库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")
, L) ?/ U9 V: W+ [5 I

7 C9 S& v- j: r' I

7 M$ a8 _1 z4 h8 N( w$ b/ H4 T" Y; v

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

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

f5c3384582002193c2c6c354a3d26729.png


: S. {2 b1 o" t# v# G

  • + u- @' d" x/ `: c9 D9 E

  •   D$ q, n- A- }" j) G

  • 4 Q* E0 o2 \7 n! M

  • 0 X" [  ?7 U8 g8 O$ }

  • 7 I' l6 o8 d3 l& ~4 D

  • ; ^& L5 e; B, O1 h  |" S

  • ; x" ?: H6 _" M6 y
  • - [. y  S+ c5 f+ H

  • " E- `4 M* C: B8 ]! {  L1 p2 A
  • 5 X* b  U* V8 m5 Z0 U

  • 0 G& c9 S: ?  E

  • 8 s. Z* E1 ]' |4 j; ]

  • , N3 p3 i* h+ T/ k) R  h

  • , T" J% g; R# l8 m* N
  • 5 u7 [5 L9 t4 `/ s
  • : u" ^8 u, H7 j- E7 S
  • 4 n1 k; h. ]: W8 N

  • 1 c2 e6 U, W7 y

  • # @: F* `6 x8 g" p7 |: d
  • 0 U/ {: a8 {$ |5 m: V

  • 1 a3 R! a8 ?+ P/ f3 S9 z2 a* F  U
  • 7 {& o% Z" A$ R! W

  • & M7 r0 G4 n- k6 }6 g& J5 r, b
  • 8 b. I0 f7 @4 x* Q3 a; _! ~

  • ) m! S8 i4 T( N$ @" h/ c6 W

  • ( }5 c5 ]7 D; s* K5 z

  •   Y$ X" j9 c! t8 X( o1 p# ^! g

  • & c; A, p4 B7 V5 Q' ~9 C
  • 8 o' m( B5 |9 b* d1 x- U9 t2 Q

  • ! T8 A' e; g; Y4 l, t
  • * i/ ?, O4 \7 e/ p

  • ! D7 j0 @2 E; p' D. Z1 I

  • + r4 |" s1 f; H9 b: ?; R

  • , t& b- ^6 ?$ |% X# M) x

  • & u$ s9 z: U/ s7 W# C7 V7 J

  • & `4 @5 }) f3 M# ]4 ~: n9 \

  • ! t' m/ @( d$ l
  • 1 V0 R- c. `2 G9 l- B: n% c
  • : L. o1 Y& z  t  }& V& @0 e
  • % X, u* g# h* ]
  • & A4 K/ `3 {, J9 F) Q

  • 6 N- d7 s2 R) R' {( Y7 _8 u3 {9 N7 y
  • . H' K$ n' r( ^" x6 i5 ?

  • 7 g" Z) O' C, y& X- B& @- |

  • 0 H& r9 k1 X7 ^8 K( W$ w5 y
  • ) x( [6 n& V4 k- W- B0 o5 K; c8 _
  • ; ~6 a0 \2 D4 }' F6 {' E! m: k

  • " s# c4 m' v  y& h! k3 b
  • , v# y7 R2 Y# A0 a, E5 [
  • ! h/ c1 _$ W3 g. ~
  • 2 ?# ]- |: G5 ]. A( W2 \
    8 I" @1 }% V6 g! {" d

##绘制有海岸线的中国地图#引库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()
6 T) o; c" ?. H

; U+ r/ i! h9 C3 b: Q+ b

& n" E4 g9 ~- s2 ^

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

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

28af454b4567839d9c888c0e3809708f.png


$ _7 x7 j# J; N; L, I: g

  • 1 T. b. |$ F6 c& }- T/ s) D
  • 6 g) d5 s; A) M

  • 2 l. [- K) Y! r. |. T0 y

  • + k5 m5 T5 i/ k5 x6 s. m
  • ; J% J  h. x* c

  • ) G8 ^7 N1 g$ b! J" Q+ h9 N& W" z
  • / b4 T! n  C7 s2 N5 Q

  • + i2 D" x, ]; l5 s) S) x2 y

  • 7 ~  m2 i6 s( k! y& G5 Y7 b7 y- [

  • & O. Z0 s! T0 h2 i& A( W

  • / z, R4 ]0 j  V! B
  • 2 p6 s8 H! q/ c! x4 G

  • * I1 _' E& I" ]& G. f2 U

  •   O4 M7 X# E2 w3 D
  • & U4 i4 i0 m2 I" b" Z4 y6 D9 U
  •   U# b" @8 Z- @9 N

  • * g- C% [' @- l0 B, m8 i9 q

  • 9 w) Q% G+ M$ H0 l% J. Q! s

  • 0 x3 K5 k% O1 R# p* c; V
  • 3 z3 Y( Z+ C3 F& m7 f. F% z
  • 9 J- H% B# E: h% L$ `0 E1 n

  • 4 e& L/ Z' P6 l
  • - K5 h  r& C. n- [" W, \
  • 9 n/ T! K$ q$ ~

  • * P( c$ Y5 u) R$ ]$ k
  • 6 X; f: ]8 i% F+ O1 v* |

  • , Z, @1 X7 I  U  c5 n

  • 2 G$ C5 B" H( V( x2 h7 ~9 M. G
  • ( j. s% l4 |- Q" P7 p
  • 2 j- p7 {' F) L

  • 8 g% d. ^* J" I; I7 ~
  • : N$ V6 K! ~. e' T1 F" w- s5 M

  • 5 v1 ]2 |: K4 X8 w9 u$ W
  • - J" t% I1 P! |$ l- o3 a

  • 4 u- N0 y; J1 y6 f, W
  • 8 u& Z9 }0 F2 M. Q

  • ( R8 a3 ^# x  U3 q% q

  • 6 t: o, k" L3 B

  • 0 r% C* y6 j( R" _2 ?
  • , |9 l2 [; S2 E7 t9 h3 h$ D
  • 5 b) M( a1 L3 |# c+ b2 s3 s
    1 l- ]; J) o8 x0 Y7 t& h, 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))/ k. E( q8 b" L& I


$ e$ w9 X, Q2 b- {# J/ S' S

7 W. t, s1 ]. n( f/ N
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  

& j$ \+ Y! V- K( g% y" W# ~
  • / K% h! l+ M0 O6 `* D

  • . {) D' n- y% m$ \& f2 O' q3 J
  •   d) R: [3 Q+ u& W2 U

  • + v* l1 m/ b5 d* a
  • 9 E3 a9 z* G8 I4 Y9 m7 P

  • 1 }" n! x3 |: B2 r6 {0 l5 O! z
  • 8 s! e, M: w4 H3 Z, Z4 R4 a4 W( }

  • ; \3 L  E5 {( T% r
  • 6 i0 b3 h+ X4 v! t
  • : C0 a. v0 u9 a! L8 v) `

  • . K! `) P; L. a9 c. y

  • ) S$ c1 J$ ^3 u2 |" _

  • 3 B: n5 Q; |) }! F* f5 p# R6 H6 F

  • - |- m8 M/ f) C( e3 n1 G- Z; |
  • - r' s1 |, [! N! z( z% Y

  • + `8 z; N7 w1 a' I+ e

  • ; V( k7 V& e8 J' h; ]. k  [( U

  • ; N" o7 `  h& A! {7 H' e
  • 0 S% t8 K$ Y% v% S0 T
  • 1 \& }. |! ]) O# _$ z: D

  • ! ^0 M8 v- E0 C; n1 Q0 e* c
  • * p( W* s* Y/ y4 m2 N+ e: x, w

  • / e7 y1 w6 C) s0 Z; T3 M6 N

  • # \9 q$ c% i, |4 Y# e

  • , H' ^1 P% g  ?+ e- p$ T6 v" p

  • 9 L! w( P6 Q& j0 g' s' i0 P; t

  • / c/ |' o8 E. x. W) U& D9 F* \
  • 3 z1 ]$ Z) S9 u4 j  u4 e- ^& p, _
  • " w( M% ]3 U8 I8 m! W

  • : `0 x4 m0 r$ u
  • 3 r/ m1 Y3 O. }$ p# E( T: ]. {

  • 7 y/ e6 E7 `& O9 m5 Y
  • ' b( F6 g. U. f

  • $ g% v; l/ N9 A' B) G

  • 8 @  v8 I$ z" p: Z+ |
  • 8 d. m; L4 o% @& J9 ]

  • 3 K- I% m* h$ K- X$ ^1 e  ?

  • ! H9 y9 \0 z. M6 A) e# _1 P2 `

  • 2 g& g' L* _5 O1 ~7 u& K
    9 V" e  Y* d9 U2 @2 D" e2 e

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))2 S9 y  @4 O+ N; L' ^* a

3 t- P% V1 q' }/ K# @
# ~' }: J2 P6 }+ {; a- Q" [

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


: X$ R1 d- [* c+ l' t3 j' J; h  d
回复

举报 使用道具

相关帖子

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