收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

[Python] 【气候软件】Python10:绘制标准的中国地图

[复制链接]

7 `- e* t5 j2 }* m0 L: x

气象数据可视化主要依靠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("···")

    7 U! m- b9 s& t; y

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

) Z& S7 h/ a0 n$ K6 C' E

绘制中国区域地图

前面python9的文章(Python9:绘制中国/世界地图)关于中国区域地图的绘制方法除例3,主要使用的是pyecharts自带的地图,其中中国区域的地图有问题,所以不采用这种方法。下面根据其他博主大佬的文章(python绘图 | 中国地图最正确的使用方式(九段线&南海子图&高分辨率地形图一个都不少))进行适当改进,并采用权威的国家标准地图比对无误的地图文件绘制中国区域地图。以一个具体实例完成:

(1)正确的中国国界线,省界线,九段线的绘制;

(2)全球地形图的添加;

(3)中国标准地图文件的添加。

2708a4a2d4c2f8f69c367e9c20ffc43a.png

提前需要下载准备好一些必要文件:

(1)正确的中国行政区划矢量文件;

(2)全球地形图文件(从大佬提供的方式中获取的全球50m分辨率的tif图);

以上的文件可后台发送“中国全球地图文件”获取。


& B4 G- O% M/ z8 C3 M; @

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


  • 7 _4 W# B8 Q" f0 W9 l; D
  • 2 A( l; [' f8 J2 M+ j' F6 F
  • - B0 w2 z% K9 f; V1 |9 ^- _5 }; M
  • 2 e. K* q- A8 t8 S1 U( k% K

  • ' q6 A! W6 ]# q3 u0 H

  • - L$ B2 t2 F0 g+ P# U9 m

  • 7 S+ m* S$ S! \' u$ x) `7 k& s
  • ' Y5 O% `" |4 K6 \( @; V
  • + g; J: V9 V1 V# o6 C. C9 V) Q9 m
  • ! o6 e0 o/ r  N# X) ^9 W
  • & S$ r! @7 H& L

  • / ^( k6 \. E$ u& F2 }6 v

  •   _5 R- \5 D* O. z
  • $ N$ P5 ~6 g) T$ L, K4 o9 t
  • 7 c) u' ~* |7 q: M% M. ^4 j

  • + ~. F  T/ x9 A/ G1 ~, h( K' t' G
  • 6 O) |8 d/ O' \- C: o' ^- a
  • % ~7 R8 ], r# g. O6 z6 ~
  • ( x. i% s3 V4 R

  • 8 u4 `/ A6 k- Y' w6 ^1 k
  • 9 i/ ^9 H1 x# t$ @; M) [. X
  • 6 J6 U3 j% k& j9 n) y

  • ) m) k/ e9 z7 s: P

  • 1 D: ?- A1 e& _& }4 Z
  • ( a; u( q8 d% k$ B

  • & q: F# j8 x; A

  • 6 k1 R( N4 E; b/ Y9 G7 [

  • 7 d" F) y0 E) d9 c" J% q) _1 W
  • + F( |2 H6 i3 u* D( K) I( V/ i1 c

  • 9 K; z$ K& z+ x. o: v- Z
  • & S, M8 b/ z+ a/ s6 N; d9 s6 ~+ C; Z

  • 1 \" e4 X% e/ u+ W9 L( P
  • ) O3 W' h) p. x; j

  • / O) `! a5 V# Q
    $ |: F0 k$ Y7 C( Q* T( h

importnumpy asnpimportcartopy.crs asccrsimportcartopy.feature ascfeat   ##添加地图其他地理信息所用fromcartopy.mpl.gridliner importLONGITUDE_FORMATTER, LATITUDE_FORMATTER   #添加经纬度所用fromcartopy.io.shapereader importReaderimportmatplotlib.pyplot aspltimportmatplotlib.ticker asmtickerimportwarningsfrommatplotlib.image importimreaddefcreate_map():extent = [70, 140, 0, 60]shp_path = r'./cn_shp\Province_9/'#可后台回复索取(这里很容易出现问题)# --创建画图空间proj = ccrs.PlateCarree()  # 创建坐标系fig = plt.figure(figsize=(6, 8), dpi=350)  # 创建页面ax = fig.subplots(1, 1, subplot_kw={'projection': proj})  # 创建子图# --设置地图属性reader = Reader(shp_path  +  'Province_9.shp')provinces = cfeat.ShapelyFeature(reader.geometries(), proj, edgecolor='green', facecolor='none')ax.add_feature(provinces, linewidth=0.6)ax.set_extent(extent, crs=proj)ax.set_title('China map', fontsize=5)# --增加高分辨率地形图(需自行下载) #可后台回复索取ax.imshow(imread('./NE1_50M_SR_W.tif'), origin='upper', transform=proj, extent=[-180, 180, -90, 90])returnaxif__name__ == '__main__':warnings.filterwarnings('ignore')ax = create_map()plt.show()$ M3 G. h+ j) I1 A4 o8 J


. r( Y6 E7 f: K. M& u" k, u) a

d52d01fb8ce51133f92387cb24035cb2.png

$ |; }4 r& y- ^  e8 g
                               
登录/注册后可看大图

上篇文章(Python9:绘制中国/世界地图)的例3:绘制中国区域地图,包含海岸线

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


+ |+ S- G6 Z- f: y# V# |7 P                               
登录/注册后可看大图


0 W6 s1 c8 B& |
  • ) {* t7 @/ T2 V% f

  • 8 W* X- {/ o5 U, O, J

  •   \7 R  G( Z4 R0 j% Y
  • , P8 p# f$ I+ u0 M8 i  h! v$ p

  • 3 p! n- v1 p- r& P$ z( ~
  • 6 i, A9 r. I, N. E
  • ( d/ @$ v5 E' e- g3 Q1 w/ ~& m9 ~

  • ( Z! d3 i" ?* {

  • 1 Z1 C6 s2 v% Q8 l* H, u8 x; J
  • " k! g! b; x2 v

  • 6 E- k& r5 }  [
  • 3 x3 Y. W' {0 H, T: f& P# o
  • ( B0 d. @* i& g: f

  • / ]( }4 M- O& l

  • . N% e  g, _) l
  • ; [1 t! [2 o# z2 T, t  `
  • / Y# s0 m' g! l2 ^% H! ?. {

  • . F/ N" o  ]$ D' I; D: k- |
  • $ N1 Q0 N3 D" k! K" z) |) O
  • % g& {5 |# C: j3 H
  • $ X+ Q) w. K, U2 M3 C8 J" t5 A
  • 8 M# w- r+ ~: ]( u

  • : R8 V6 G+ @' E- Q8 m. v  _

  • 4 \2 w6 i! U2 n: N% ]" Y* Y4 a7 M! \# ?: Y

  • ( T. {  e$ q8 j1 r! [8 r

  • 3 D) b' P8 {+ R  A5 I2 s+ l0 ?

  • 3 C1 Q& O; W9 b% ~

  • 0 H8 T9 o) y  y# ]) z; |$ g- x

  • 0 r4 G( d& C& ?- L2 d8 l

  • . o0 Y+ C$ q8 L8 I
  • , Y: M; L4 g7 y5 k

  • 3 q4 W  Z; p) a; c: R
  • ; l+ E* v  V5 W) T+ X: G! o" F

  • 2 m, A/ y1 i" T& i: w0 ?7 T3 e

  • + ?0 j, r7 K' n9 q2 B( S' }
  • ( j+ p; Y' R! W7 E* V
  • ( y  \3 ?0 s1 k6 z+ K/ ~

  • 7 [  {" }& ~; }. m# c
  • 9 p, t& ~$ g; ?0 }: Y1 j7 L9 \  {
  • : _5 i0 Z& w4 k, \

  • " S! o" O3 D# Q

  • 3 @1 e/ R) r$ J9 k5 i5 j
  • 6 J  Q6 I8 B! F3 B% A! f3 D
  • . y9 ?; f1 ?. d3 w* U

  • ) a# s) T6 U; q, d: M; J

  • # N, |9 k3 ?3 L, D) ]1 W

  • 4 m7 ?: @2 }) \" {' c+ E

  • # d$ p9 A* a3 m: S% q/ w

  • - ^+ k6 k- e9 m- D( B- h- O

  • 2 A: ]" ]+ X+ c  D. {5 I

  • 6 `+ _) F+ Q) i. q. j! \, E* O' {5 }% ^/ y* L1 Y4 e2 A# E

##绘制有海岸线的中国地图#引库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()* I3 ?1 m7 W" |

0 f+ k) }5 l: P9 Q4 q, m
# n( J7 _9 @( Z1 f0 E

颜色表:

706a2a5d8e3967476b47c483a33ce236.png

9 w# _) ?& t: ^6 E+ B
8 g1 L. _( b" g
f5c3384582002193c2c6c354a3d26729.png
回复

举报 使用道具

相关帖子

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