[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("···")


    ' b; \+ y- I& r7 E

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

  O5 _2 C; z% R! E
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • 8 e7 S7 f9 W" n9 g

  • : V0 G7 C0 V) q3 |; Q" Q/ G# ?

  • # }4 x. n. G9 ^+ Z* T8 f

  • ( ?- Z3 p6 W: u6 d& s5 G

  • : R( {  l0 x8 F* L9 `

  • 5 P5 G( K+ L0 T: {

  • * p7 v. z! V4 b4 E! p6 V

  • 9 U9 u/ i  |) z0 }  i; ~4 n6 z4 T
  • 6 ], V& y: B# `

  • 7 M. ~/ S$ K  ?- |

  • ; B4 F2 Z) c5 j. L% A

  • $ E: x+ H& M5 D- h  J# u9 p

  • 5 ]& M6 R9 B5 ?5 U; Q( ~6 H
  • - b- m7 E5 F. w$ u, N# Q% R
  • 2 k  f) z1 Y' g( n+ Q4 J
  • " k( U. ^8 h$ R1 Y" }

  • - I) d3 v/ Y2 ^, {
  • # Q( ^2 h$ b2 [0 k

  • , \* j6 A7 R6 G
  • ) m* w6 v; \5 H. @
  • , d3 o6 \! U+ ]; H3 h( N
  • % x1 b' h6 w, I. y+ u4 U

  • ( z+ ~; Z& |1 i$ \/ ^

  • & G# a. |6 i& }

  • 7 a, V8 f$ f8 v2 o/ ^( F& z( d  C4 T2 F* f' z

#绘制中国区域基本地图轮廓,包含省界#引库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")7 c, f) p7 `- X& K

5 m: Z7 m+ R0 F3 w- r# j3 [7 ^

8 Z& B* w' u; ]6 r' U2 r1 x4 A7 J

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png

2 h( h. V6 A5 c7 B1 s* y, D
  • 6 g: C% D& q$ a$ s3 a4 Z0 _
  • & P/ T% ^) G. ~# y6 ~0 |

  • 5 c- F8 T: w. |8 a& ?

  • 5 P% g: ]/ M' E: o2 N! `. N
  • % Q# _0 J* p/ Y5 ?" f% E6 K
  • 7 {# M4 B* y* d# T1 t- j1 E9 j! B

  • * |* i! a) _2 T$ k; n7 \0 M9 Q

  • % Y8 ?: y# h! ~* n1 x% P

  • & j8 p1 y8 b* x2 G4 e4 k+ y

  • 1 W  Q3 Z1 f' G5 |' P* H' p0 L

  • 7 w; K% ?- e' x! F9 [4 n$ N

  • + Q0 Z! C, g) }+ i

  •   \7 a$ U7 }. u; P& ~, y; R2 V

  • 6 h: M" K0 I! F
  • 4 h  Z) O, x5 a/ Z
  • + ~1 m. l& r! @' f) l
  • - \+ A* t9 G% e0 k2 I4 @: _
  • 1 @* c* R; K' ?

    4 \4 l' w" y/ U# x  F/ C; u

#绘制中国地图,并标记各省会城市名#引库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")* M& y' w: J8 S# W& @) G

2 E* H' A! F" C: v
4 C  q  J0 k! ?% V0 u

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

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

f5c3384582002193c2c6c354a3d26729.png

! q% g# J  m  u6 r. Q
  • 7 l" E: n6 C( f2 A) L( J
  • ! C* m  Z. ~: S: k( B
  • 3 Y: `" S5 H3 q' x1 g
  • 8 Y1 u3 A+ F0 J

  • " f0 Y+ l) D( u: Y

  • * ?7 C7 u, Q( h- {
  • 2 C3 A0 A2 C( [2 S& [9 k. }/ d

  • ) C7 c# s) B# n1 p: }) c6 k+ c
  • ; W( e; V7 q- P+ w/ t

  • ! N* H4 ^  ^' t6 @2 p( {

  • / `) D: i; W5 m6 j8 k

  • * q5 i6 D' c! y0 \! X! b

  • ( j* v* U9 T- O. o* }) A9 r& J
  • 0 R0 @- o$ B6 r" v2 q$ P* `! ?

  • # U# a, v6 x& {1 Q7 R2 q' D

  • : i$ F7 p( }% H0 ]+ l4 ]5 G
  • / H5 K% N. V' a; \

  • 5 K! o5 @9 g& ?

  • ! |0 \. {) z; b4 w( e4 x* ?

  • ) E& A1 o4 Q0 Z" g! [5 y& M& R3 U
  • 1 P* z/ ?9 ?4 I! a
  • / _, V1 ~2 L+ t* F# X$ V
  • 3 G! s% ~+ s0 ?& G
  • # _) ^: E  w: W" T2 Y# Z

  • - u, `6 x6 M% D& d( O

  • $ S" ?' N. {+ h

  • 8 t5 }( d- x5 }. p, w' T6 L+ L

  • 5 v3 b* Q& I) H8 D' t& i

  • 9 ?0 H& S( g/ ^! N
  • 2 V, W3 T$ `+ r1 U/ s
  • " a% Q7 P, @# [

  • 8 j8 f2 t$ O( |% ?- ^, v' a1 Z
  • : E$ b+ V8 v  N& u
  • * k4 S7 m- T+ I

  • ! Z% m, X, {2 M
  •   w; R5 X9 s1 |/ U: M" m/ Z

  • 0 ]: n) }$ _6 c. F6 H
  • . b; B9 B, g4 I( L/ f' r( q# Y

  • , `8 {" R$ X  j& [- a, I

  • ' P/ Z% \4 K( [1 r/ i% N
  • ; o+ m1 k- Q: C

  • ( U: k: E, i6 J# U) I
  • . C6 U& P2 F: x  M! Y$ H. J' d

  • ) i; k* ^5 S0 d' x" L3 @

  • / J9 v  ^5 v0 p

  • 4 A- q6 D0 j1 u! h1 P  _
  • . b# |) B/ e) g4 Q  H+ ?
  • & y6 j7 E1 D# k& O
  • ( J  c! x2 W& @* w0 L6 g

  • . R4 ~: B* W+ ?" |
  • . d* l1 h8 q" \9 l; |! N4 H0 }+ X6 H+ m
    % h# |4 F- Z4 x/ w7 W4 L

##绘制有海岸线的中国地图#引库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()) G4 f5 s- X1 `. }0 _


* r" O+ k9 I9 A
. b. m' }4 K2 U3 T3 J

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

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

28af454b4567839d9c888c0e3809708f.png

6 n1 q" J  |- l% k
  • 3 p6 T- L5 G# z; M! J. d
  • 8 d$ m  |) j0 J2 L4 d; W3 M

  • * q' [  P; z: k) z# A, Y' A# B$ t

  • / y+ D/ _% {4 O5 h
  • ; B& o, |& i* T- U- b) M" ]
  • 0 S1 p) b) ]* B6 B# z

  • $ ~) j: p0 }; {, k$ ]. g
  • / Z; b0 ^: X' `5 d; p1 C

  •   @5 P& J3 c5 R( |; n( Y& `; k+ V
  • + U, F9 z& E4 k+ M. |
  • : P- f/ E/ S9 |; C
  • ! e9 Z2 x; S7 r  [

  • . y" I* [. i4 t2 F
  • & W$ J) |: M0 k5 a# o
  • 5 ~+ G2 p+ i0 T# b

  • - V. ^" t# ~4 \! l; t3 a: g
  • $ \' X% v8 O8 P9 i8 T$ ?) B* S

  • ( S4 Q0 i) w/ P7 O, ]+ a
  • 6 {. }( ?( x3 w
  • ; m! c. f( o7 _% q4 e' U
  • ) h& b( O7 o9 {; H$ {& g

  • 1 i) x" Y6 Q5 }  _3 a# p6 A6 F
  • ; j3 [+ R* [6 T' M

  • 8 c  c: \+ q- U3 r; w+ k
  • . `) V/ @0 N: ?5 _, J

  • / W0 B. u3 C8 e/ `0 X% Y
  • - z3 A' b' b) E

  • ! s: W: e! \% |% I

  • 2 m* v* Y. L; C/ S1 w

  • ! ]5 y; l/ T' p0 j9 i% k
  • ) g/ c, f4 J, p9 v* V: x

  • " O4 _' i  r8 ^

  • 8 S% {3 v. e1 U1 j) ?* D1 I( C7 _) s
  • 3 q- a& o( `) N; I5 e" r0 r& U
  • 4 k! d& h4 `0 r9 L" ?

  • : E2 k5 ~0 @( m) S3 B

  •   H* ~) @6 X/ Q3 d
  • % P# u9 a) W1 S4 G5 o. S
  • ) B0 w' F0 h! D2 ?  i4 n
  • 0 j  Y0 K: c) X6 ~/ Q
  • - r. H. I. V" Y6 ]* R

    ' [* }: o' C) o; S! R( `2 i! a6 a

#例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)); t. d: q7 Y! C) [8 P

1 b& D' t" _4 ^7 X

* S! ?/ l) [& k/ G/ i7 k* s
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


! {$ K/ G+ r; H9 a: B0 s
  • ! ^% A8 g6 n6 k+ K$ r# C

  •   L; q9 d, [' |/ A
  • ( y7 {+ O9 \8 R- x5 r
  • 6 T$ t4 S$ S$ f! y

  • ' l  F# l3 q1 f' b

  • ; R8 e8 }- C# k

  • 2 m7 T4 v% m( A1 {9 |! Y5 F

  • ) X0 Z3 l3 g/ S3 R) N6 U& g7 b  X
  • ' h2 z: R: f& p8 ~

  • $ W5 U" Y5 a. g: F4 g( d

  • * A. m! Q) Z# e3 i5 t4 |

  • 4 H7 r1 C3 r9 \3 r3 b8 J
  • & ?% F0 J# H# o. H

  • % O, }8 O6 C6 ]6 R% Z# B
  • 3 P. K4 t! L  I

  • 9 y7 @( z% Y* A! R! C: M# o  T
  • ' I- O, b) z" w5 w* h" N
  • 3 U  n9 l) d. f7 ]5 s

  • 0 p) b! I" D1 d) s; S* M( {! j
  • & _& R6 A+ M- P* r! ^9 x6 u

  • , q) H4 \/ G, M0 \4 ^+ b' F: X
  • ! i, J9 a# F8 q$ Q/ P/ T
  •   R/ }. F: B( F3 y' A0 `: S

  • ( U% q& ?0 _7 W( D
  • . J1 v5 x. `" A, }  {2 J1 D
  • ! U2 |7 F0 t/ e% s9 C
  • ) D+ q' y0 S' K

  • - A8 Q7 Y4 B1 D  l* M7 ^' i
  • 1 T! c$ }1 a' N) S

  • ! c! i1 s- S& |, u- V9 J% P

  • . D, @/ k$ O1 h+ ?8 E
  • 7 N& C. p, u! D0 @

  • " ?) ^# e, |1 `" i/ i

  • . z  ]) r$ Y0 N. s  H" O5 V+ m
  • ( t: G7 D, Z2 p5 s+ _' ^* R5 {
  • ! g) w8 {* B; @) q8 }+ m' r

  • , V- d% D/ W% B; _

  • 7 l1 R0 }# ?2 B$ T! t

  • ! D# A7 u+ D4 \0 U4 G/ D- J" [" o

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))" }: d8 Q/ k& {

1 x9 Z' t  [; F4 L" @
8 C  ~; H* ]3 I

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


: Z) Q5 j8 d$ b( O& T# A
# S$ M/ ^' W7 O" ^+ g" D" r
回复

举报 使用道具

相关帖子

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