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


    4 K! G7 r- \. p2 R& ^3 a3 f3 {# T2 [6 L

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


! K4 ^+ q0 Y6 L- Z                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • % ~7 ]% Q& U8 j' H

  • 2 {8 n8 o, R# v4 U! ^8 l* R8 c
  • ( q2 P* x. b: g8 ^8 V
  • 7 O* Y( v1 @* }5 e4 @: v# T+ g9 Y" A
  • 9 a' H  ]. z2 }8 m3 K. Z
  • - G( w. R& @' R0 r9 I, B" A  p

  • # _* x' X/ Y5 }! I! E7 ?7 z- q, y

  • ) |! b/ w0 [, K( M) A4 y
  • ; X3 h% e* `1 r# P
  • % ~4 l8 x' v  ~( W9 M

  • % B% Y# j) l& r
  • 3 N' Z; D" T& o
  • 8 O1 B1 L) a& L9 Z5 J  `

  • 4 @0 t  s0 T# {  Q4 V  D" n. L

  • " w# x+ M2 T; g9 ~

  • 8 _5 Q4 a& w. U: s+ i; w( Z

  • 5 ]9 i  A% l; d1 K0 o+ |8 f+ y

  • - X7 Y9 i# X- l9 {! c$ f

  • 2 v9 J0 I" o$ ~0 B4 g) g- t8 l- T
  • 0 w' B* O/ q2 v. h5 f; d( T5 n( {

  • : d, p2 O$ r4 Z+ T
  • $ }2 {  l3 `/ D. u

  • * u5 i6 A; a, V4 y+ N; K- ?
  • ) h, e9 Z, Q5 V( s& |

  • # c* N1 D9 C- X) T$ j( B
    : C; B' z8 T, R6 U, V  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")% T" t' Z5 e- P. ?4 D6 I" Y) J


5 @) q" j$ v7 X1 B
, A# W7 p/ `" x( M4 W

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


& |( }" J: \- I& m1 Y5 }. w/ x1 M( A
  • , w' B6 R1 Y5 c7 Z- Q* z
  • - [7 |( U7 z+ W9 V3 P

  • / Y; g) T$ J" X, e. J
  • 7 z# J5 q& Z1 _$ a% G/ }

  • 9 X8 B0 ]9 k6 t9 D' V
  • 1 B& E& ~- r" A5 l0 y
  • . ~4 f. z" |% z) Z9 Z: I

  • 4 [9 O! M. p: O  e: X  `7 ?% \6 H
  • ( e& ^, ]( `: B& b! ~
  • + V" J) r3 q* D9 D" q: b

  • 9 Q( Y7 Z" ]' a3 ~) j1 l  t' z! C7 Q
  • % E( ^- M  k* D

  • ! J, k5 U0 R% v# c1 q
  •   m1 i3 l/ }; k# X6 \

  • " ~5 k1 D1 C% l4 E8 I" J
  • 6 h4 g0 [% H! P! X
  • ! o5 U- c, r% G. u

  • ( q- Y  D! M( Z2 r# q1 o( I
    $ _% f2 y! h! I; G0 s

#绘制中国地图,并标记各省会城市名#引库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 b2 P, l& l. j

& c* T- H7 d. ~  E
4 x# U+ a: O2 [3 e

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

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

f5c3384582002193c2c6c354a3d26729.png


2 f/ X1 M4 L" ?9 F. E
  • - b3 u/ L- G& z( S, A) H7 h* U

  • 6 }0 {- w# W7 k: \$ k% \& w* y5 J

  • 8 g  [6 e9 g6 B

  • ( e* j. w  C! m' D& H7 z
  • & R9 C+ G4 t/ r( O

  • , a# T' N# H$ \/ O6 k

  • # v. g( b9 p. Y

  • : G* ]6 P# V/ j9 u
  • # N- u/ [- M& J) `

  •   K% _+ D* g6 y) X7 T5 w

  • " ~( U- M! h, {7 G
  • , X& {4 j5 s1 U/ ]4 R! U$ Z$ Q4 p

  • / N9 r! a  w) V+ p. s

  • 0 d: u' v, f- Z
  • , y( `$ a" H* T$ J
  • " k4 d; T# o* K7 N) P' w2 x

  • ) S& W: \3 |5 q$ N" ~9 f$ m

  • ' @* X) K) |' i9 A. Y+ Z
  • 3 X1 Y% F9 G0 N3 w5 ]$ |, ^

  • - I- l* a: m3 }7 |$ U7 K. s
  • % F; V$ _% p5 a& S  M
  • 6 h, _& N+ r* g) p+ k

  • " {5 ?1 s/ i1 L/ f- E

  • 9 ~& g9 J2 G5 h6 s5 Y; F  T) D8 s
  • & t( E' u* h. B, ]+ [# M
  •   z3 s9 q7 F- Y" s$ J
  • : c, M- m$ M/ j$ P

  • / P4 a# v6 j% l) A, f6 K

  • " j8 m! f3 {# o. B( @
  • 0 E; _( `$ K- ]

  • , C" N# n% V6 O8 q' q
  • 8 R+ }) S1 r' N3 u- G2 k1 |
  • + d$ b/ O' `  x. k. c

  • % t: I+ M* ]7 m( G
  • 1 a) A. u9 q8 p6 Y; ^9 s/ F
  • 5 W) L( D* u' e3 R) O7 x

  • ; _" H7 \( O2 i  t7 _6 C7 @+ [

  • ( H# U4 S# {8 o( [0 f1 |

  • $ L+ I, J; @+ F% y

  • ' L& c" @% ^) E9 g

  • 5 q4 y# n+ Q# N: d5 S, n

  • 6 U4 H6 i  y& P

  • ' j) ]$ c* Y2 I; Y- M7 T& A2 C$ `% F2 D1 s

  • 0 X" \: D8 [9 Y/ ^: I
  • 7 {% c6 I5 u" l" W

  • $ T2 `: A4 }5 y/ a$ B
  • 9 H! y( R9 u2 ?( ]3 b# A. D
  • ) W. B5 J; d0 i( w7 D0 ?: O
  • 8 T: r4 W5 l  |8 ~

  • . z& e3 Y/ {# Y% b- y5 p: W3 ^, [
  • 4 R; V, n% W2 n1 s* ?- w
    8 }0 @5 P& I# I1 q3 y9 g% F% Y

##绘制有海岸线的中国地图#引库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()1 q7 ], ]2 f$ S( d

' x8 R# A. S& y& W+ R3 L
5 d. ], H* Y7 ]) a6 j/ A

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

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

28af454b4567839d9c888c0e3809708f.png


9 a8 n, j( x8 B. O3 y

  • : k- ~) Q( i! m2 l1 N9 Z

  • 9 q" T6 J% o8 d) {
  • , h8 o+ `/ P2 }/ w8 d. h3 W
  • * w- P1 R2 M3 @
  • # @: y$ t; x7 l. [- |- g. Z

  • 3 G, @) m3 G7 ~; J
  • / ?# F; J, j9 Z5 T0 f

  • : f0 r7 I3 f4 W- Z! }
  • % @- f" Q8 u- f' Z4 t3 k4 e: m2 U* [6 Y

  • . }3 m* X4 r4 C2 D* U) J. K
  • - J2 A& W& Z& K+ t( {* G
  • * Y& n3 q9 b; N) Z8 k
  • " X% q" D7 [0 ^
  • # m. a/ H5 |9 ~

  • & ^' d7 }+ u6 |5 U% g# t- v6 g& O
  • 9 B3 i. E0 k  `/ O3 O7 v1 G7 x( b+ R

  • - g7 A% B8 {8 S4 l. w1 {

  • 3 r$ B* L2 h7 y2 x2 Z

  • ! r8 ~; z+ q% ^" F

  • * c% R$ k; n$ z8 g

  • : f5 H6 m3 o0 ?. Z# K' [

  • ' T+ C; m4 y. o5 r$ o7 q, l; o

  • $ M: R( m* [+ r& f" b: ~$ y

  • - Q' p- v# _+ ?; G9 P
  • , H, ]$ Q0 c) ]
  • 8 Y, O  l% k" t$ N7 V% @+ x
  • + m8 V+ E% z- [3 q+ p; x! ~: t  G+ \
  • 0 z/ }9 }0 @- c7 u6 [( j* }

  • 8 i& T0 e6 r0 t1 f
  • ! v! c7 G( D" ~; [
  • 0 S: @. h$ ?5 I6 O, Y1 ~( a

  • 3 D# p4 }! @: t$ R9 Z* d
  • 9 U& L* F1 j! k

  • ( y; D0 b. \/ }

  • 0 W" [5 `5 F8 g# e

  • ! B8 @. J* E; ]2 O$ ?4 i
  • 4 _- }) W* f% H% X

  • , X! @' M' _4 j8 e+ d& z
  • 3 |& x. F; ]/ x3 B2 P2 B8 u

  • $ F! X9 s7 s6 R
  • 3 b6 C6 P8 h+ q6 d! _

    : @0 I3 Q5 h# X, 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))
+ w- s+ i* \( X. g6 I$ W

1 }) T  K% ]& x* D4 e


" J+ O& z4 I7 V' S3 ?9 O                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


- y& ?# T  b* J) _) U# g, m

  • % O8 j: A3 W/ [3 H9 g+ d( d

  • 8 _) a, ~5 w7 m; U& T

  • " I1 Y0 T1 p6 M! ?
  • 1 r, J* ?* q$ N3 b( L, c8 }

  • " E1 P% Q3 G9 N, x9 }3 c
  • 1 N1 s/ L8 \1 Q* N9 u( G" R0 ?
  • + {* `) q# i8 G% j0 D

  • / x$ c+ d# ]6 X" ~, d: C4 k

  • $ [, l3 e5 v1 W+ g
  • 9 N9 D- [( n2 \, U! ]; h: Q- L* I
  • 0 \% ?9 Q1 x! j8 j7 G0 `

  • . y: M& T* B' A6 w- o1 R7 ~5 K
  • % x* z4 e6 l. Z, c! b) U. g7 G
  • 4 T4 ]% F, `- _
  • 1 k6 V  N" [/ l" T- Q- o

  • " r" i& A5 z' J/ w$ o4 J2 U
  • 2 u+ T' B, X- P1 y- F' \# t. z
  • ( c: s* z" k( D- ^0 @- Y& L9 P

  • 0 X2 T6 F2 X3 d: @6 V4 s0 l
  • ' N! I/ Q% a4 u
  • 4 a) D. W3 {2 X, C. b( w) T

  • ( m4 R9 P2 P) K% C" e2 ~6 j. m6 t

  • ) W" i2 q% M+ {3 [$ D; f
  • . E8 k9 I! z/ f) @

  • / @$ n4 b% u! }, ~- ]  e

  • " Z5 F7 c( _2 M( {& q  ~% e

  • " m& I8 @+ I9 o& z$ Z+ G

  • 7 H" j' Y2 v( V8 l- b% K9 ?. o
  • , j6 D5 I& a4 F! A' ]. {  H$ i
  • 9 Y) }+ |& O* p9 L* X
  • , l# r- ^* M7 h

  • . w. Q% ]3 V# R* I. O2 C

  • # Y7 ~( _& c7 ^! c1 [0 Q9 ?

  • 5 ?% J2 t9 f) h# h7 B

  • 1 S( C$ V; q/ X" q- r5 j; F4 ]
  • 0 i8 h( a) ], ^) s' A

  • 3 I7 I6 o4 s1 P& [/ ?8 p$ n7 N

  • / T0 X- J% D) L: B7 G

  • 8 T( f* ?8 E  k% _! V4 \& Q6 N* [" ?% d, d8 |! ?

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)): l4 X- T" n- e1 d% h) c# e9 L

& a, m8 x; R8 u4 G
( m  A5 h- `7 a" [! B/ x- _

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


2 P. G& N4 k; r/ E" w; p3 Q  o$ J0 ~: P
回复

举报 使用道具

相关帖子

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