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

    2 P1 v% r$ Z' T( C( u5 Q! e5 n

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

$ s% F3 C- i4 J/ L. N' p
                               
登录/注册后可看大图

绘制中国区域地图

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

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

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

c26711da656503932f79c8379d2d0aef.png


  • # S0 n0 p; s) R; q" \
  • 5 g  x$ m8 ]- Z  H

  • : L* T' N( D  `7 J) d% t

  • 2 x, l4 i2 r6 Q# A+ M

  • . @( K9 [) r0 Y

  • ) ?5 y) J/ P. i% S4 h  [9 G( M1 t& |9 J

  • # J+ T+ o/ o2 V4 f$ G  B- c
  • # i+ {) I& o9 m5 t/ ~( n0 h
  • , m% ?: m$ v9 y+ g

  • . v6 A6 t9 w( f  y# `) l, P

  • 2 E, J8 f: f, E6 d6 ^9 X- m) e: u$ d8 z

  • , o, A' \$ w/ p, @3 A$ S% \
  • $ \9 o+ b6 ~0 J. |& c0 j
  • 4 Y0 |) z: e% i* Q6 N9 P

  • ( |" U- t6 V2 n6 d! p; ]& Z2 {

  •   K" ^  j( p5 S) I" }0 V9 p+ ~

  • ! r, Q6 d. k( x6 A0 L6 E0 X7 g
  • / U2 U3 V0 [" g. y$ @$ }5 t
  • $ r5 x1 {) h2 X  |, Q
  • : r- n' d3 f6 G& E9 D) `
  • ; o* }& Y8 h! \$ e% S0 q; K

  • * \8 w# i- J! h: i* y

  • ! G9 g# z1 e& l6 t; Z2 ]
  • 6 f4 B- E8 |! }3 {" i

  • 0 h0 _# l& s* T: b: |; P' L) i; y) U& 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")
3 d" Q9 f; q2 D  A

+ w. J' I  e6 R" I& A+ q/ N3 v4 Y, |

7 U  o' i2 U# a: r

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

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

94f97fbff67b1f3a035f23ca0cb510a0.png


0 P! a, K/ c$ @0 j, |; A

  • / N+ X8 ?5 ]$ F
  • * |# B2 j5 k4 u. t: U0 u

  • ! S4 ]1 V$ i0 A' _- ^' r% u! X% ]+ w
  • 7 w- ?* C, s2 U) X+ Y

  • % b0 p- d- L1 N! x! V
  • * P2 E3 [4 F( Q& T; q
  • 9 }: ^3 }% n4 Z8 A9 S' U' h
  • 8 S# H  `! C" ?5 G; M
  • / P: {. a: C9 {. a6 g: R" W
  • : i  s8 a" O8 F( `' k
  • ' ^- |) [. n! T- ~

  • $ O/ {. B; m3 b# ^& a9 s; P
  • ( y2 N& L  ?( z

  • - L1 b1 B  T. ], o! Q

  • , _/ {7 X4 V/ H3 y! P$ M2 n

  • 5 n9 I" l/ D7 p$ [8 |
  • , ]# ^+ E+ K4 _/ ?" [& J0 t. s

  • " Y1 \9 ~4 S: U6 @, \
    + A6 d" ~+ j5 C8 e. E; 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")$ S' G$ X0 I9 G- j) w

3 X% c4 f( I1 R' O7 B% {, j

% P/ ?; p. r  U$ U- Q

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

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

f5c3384582002193c2c6c354a3d26729.png

( Q/ u" {8 v$ `% B2 u- [9 E$ L
  • ; y: L$ K6 l2 j. q
  • . ^. I( t% f% O* e

  • ; i/ E! H+ U- X
  • + G& T. J: S2 z" C+ ]$ }

  • - F3 u; a7 F% R5 k! z' \6 \, b  k

  • / b: a$ ]9 t& g

  • 2 @8 g1 v5 F" j

  • : P4 x0 j% W( f& l+ c- O

  • 8 h  D+ g" D! o" V" ^1 {8 _
  • ' Q+ l1 _; A7 o9 v) k

  • , s2 P. x, ~6 p) ]
  • 1 E) ], X( o4 P; C% E% R& R7 J& f
  • 3 q7 l1 Q" c# m- ~2 y& b! c
  • $ P; h- v0 A  _/ b# _2 i% s
  • ! D; r/ Q4 B+ V4 c, ?% D

  • 4 h' A$ P0 [2 }: D( b" a
  • : Z) b1 g, d5 [3 u9 s9 d
  • ; d5 [- O: x2 D0 N  g

  • 1 S' ?+ {$ s! Z8 X1 w! L

  • " h. o+ T3 b& l5 {$ p
  • 1 h, E5 n: g  X5 E* S6 j, P

  • ; M7 d/ y" v: g+ c

  • # Q$ W( e5 ^* L

  • , N. [! h: q2 q/ Z& N

  • + m2 [. L$ W0 f8 m* ]) F
  • - ^4 S) Q0 A2 a: ]* Y

  • 6 Y' r( ?/ H# |  G, J* P+ L  c2 l
  • 7 [( C1 b) \0 H3 y  @' U( i- b; E% \# x( f
  • , Z' y; q/ z& `9 p- z
  • 2 s: G$ O! X3 `3 x2 r

  • # q, i- z) m! r* `2 F: F

  • 2 _/ Z8 w1 I& M3 h  A0 e5 M1 {
  • " f: B( m4 h; d
  • # u3 Q2 u$ S! N$ q1 g; y" {" p  \  S

  • $ j$ v; ^" u8 h9 y2 Q5 l
  •   s$ ^( B! I& h/ S$ q

  • / b5 S' O. A- o; h4 q3 L

  • . M! E2 X& H6 M6 \+ I6 R

  • * i& T1 X) ~( L! J1 Z( ?

  • , x5 M# L, C2 Y! P- {6 |7 Z- Q) L

  • / i* I7 {$ h7 U6 z$ e/ q

  • 4 {) ^+ j6 A  K- f6 B

  • 4 s' p% J/ i4 a
  • - `+ K/ O  p& P5 J9 e
  • $ I8 f9 B! V8 V3 f! t6 r

  • * P% g1 H/ X) O5 @0 J% r! I0 y# M/ \) Q
  • . v9 I  w" U  @0 n/ n, a, f, U/ r

  • - X, K1 x- N) z) C

  • : Y3 B9 X' f; U1 V. p! f
  • / k/ b/ ~1 T/ m
  • ' y, o8 x* ]! m
    % M0 ]( z  M/ G+ H# Y8 J

##绘制有海岸线的中国地图#引库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()( a/ N) ^) W3 j

! p" X' l/ A/ `% n4 G/ o

5 e) ~# z+ R. r3 }( x! f- P3 i3 S: m

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

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

28af454b4567839d9c888c0e3809708f.png


# k: [$ Q, K, s) |/ X+ z

  • : a* a4 O' F+ g: W1 ^
  • , C6 V9 j" V  P' K/ |  B
  • ; _9 J' |. d+ R
  • ; n/ m( w3 A( E: r( O2 o( k
  • ! |& E1 O: `* b7 O# ?

  •   R2 P* w6 v' N. [5 [
  • 9 M: a6 V" I" [. Y& Z2 v

  • 6 a# \$ R  u+ N9 ^, |/ o

  • 0 R* @: M7 g: F: g% S+ {& L
  • + D4 q4 \4 g( X0 t. a
  • ! j  d% d! M5 c! S" ~: u. k
  • 5 ?# E9 |7 o; z8 F

  • * z2 k, n& m, u1 L
  • 5 N$ P# i" N) P" h. {6 \
  • # Y, @) g4 M$ J: _! l: B

  •   C3 `! Q* D- E0 v; x1 ^1 v: v
  • 2 {7 _1 r+ O  L

  • , U2 U  ]: O! H! |0 j* I; y+ V# G

  • . ^0 N9 ^8 @- Q" G

  • & T1 c5 j  o5 j1 a. K: j* `/ K

  • % P/ |1 ]: n# W" O% E) G

  • . S$ |7 B' I1 k. |" P2 r

  • 9 V- W- [) E: Z
  • ) \: ?+ F$ Z+ g2 u4 r  o* t5 L+ n

  • 8 E- y) K* |; K$ T% d$ x* R  N1 n
  • " E2 y5 C, u- q9 j& Y6 O

  • 3 n  W! S) p; c+ Y3 j) i7 f6 R
  • - W1 W: x. o2 {7 S8 O

  • 2 L& w1 j" {6 M3 F1 S

  • 2 g& i9 U( _$ u4 q! A$ ?
  • ' w( J) k4 q+ ?) i& c0 j
  • $ S8 y% T1 o% @+ q/ K5 }
  • * {0 j' r2 C3 q$ d

  • " ]5 b7 L- W2 ~& V( |6 W2 N  @2 D0 ^
  • / }$ |( d2 n. D8 ~" @4 O8 h
  • ' L. a' R1 i* S! A5 D* C: T7 H

  • - p! F% M4 W( H" A& r- ?1 L+ N6 o

  • / [$ y; H$ A( {* K3 r" K) }

  • 1 A! d! [: h3 t

  • ( I% }6 |$ U3 L8 h* z# z, C, J! w1 k

  • ! x; c  L( Y4 I$ o
    0 g" r) @5 L* i$ w

#例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))9 ?9 M, X0 M- {" x9 L. {


5 M% U3 P' |1 w& D, E! G/ B& X6 m! p

( [6 Z# b7 E) U( i+ x+ I
                               
登录/注册后可看大图

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

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

2368bedc57620857d0a0289ff1b1ce2e.png

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

proj = ccrs.PlateCarree(central_longitude=130)  


( S- a, F0 C. F# F
  • - m# h  Z  v0 B+ l5 r# J
  • 6 Z& K" s& W/ E; F* |9 [; c
  • - h4 W+ h& r/ s2 K7 Q

  • 6 ?$ C' _" X. Z0 z7 {& Z
  •   R. d' R8 Q" M# K; k

  • 0 A& V* m; p# d4 e! k
  • ) `8 F1 X& F$ ?$ ?( H8 q6 {' j
  • + \- n/ }4 ~: N# f% S# ^( v4 n7 \. `% R

  • 0 {! ~! \8 ~+ B

  • & F( U; W6 _# p* m. A; [
  • " Q  m  Q, Y9 I& H# s

  • : e3 p0 [% L: Y9 L! E- N

  • ) F! P* |- O! ^8 I6 _1 o
  • ! |$ B9 G& z3 V, W
  • + W8 P# ^7 {5 [% }: |( B

  • . ~; a/ f9 O4 C) t$ ^

  • , [$ N; m% b: y. [2 V+ C
  • 7 i; i4 P  j5 A0 x8 T! Q& T
  • ) G  q0 f  {* {& T, @6 k
  • ( z9 O/ E6 |7 Y) B7 t% m

  •   G1 s( s2 {/ E# g( X8 J6 C

  • 3 b/ @& p8 W7 i

  • + f* g% ]7 I' H5 G8 r
  • + j: ?5 z0 u; U) A+ M5 m" q

  • 0 p5 K& ?9 v8 G* ^$ ?7 ?9 o3 G/ m
  • $ O  \; f+ n0 y  s. D

  • : ]. G% `5 D. a
  • 2 J4 W9 {  y5 A

  • 8 a# }9 b. D* E1 L" {4 c4 I
  • ' s; i, h1 k& _% d

  • $ `5 j0 T! V8 l4 @1 k/ e/ F
  • / y0 L  b: i( c3 Z" \0 f" S
  • 8 S/ u) l9 [5 U0 T9 V# J
  • + l6 h$ h; i& \
  • * P  ^/ p0 p6 x- ~

  • 1 d- H" x- X6 z% f1 ~8 S% t- W
  •   s6 S/ ?( D* ~' _" ]

  • ' |% I7 p/ Q, j# v$ L3 w) e( Z

  • 7 F5 `/ m; `1 M& w4 c
    7 ]- t/ D5 D4 T$ e1 a* _

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))$ p* g6 \- l  C7 u- O+ o, ]) W( l


( e% v9 T( y% _0 G
- |. Q$ \# T& L7 k0 \" E9 n  h( T

颜色表:

706a2a5d8e3967476b47c483a33ce236.png


8 s" z5 u) a6 X# d/ |& p
7 v" d1 {! x4 x# O0 S
回复

举报 使用道具

相关帖子

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