南海海域地形图绘制+叠加观测站点(python)

#存粹记录自己的python绘图摸索过程..... 全靠百度/(ㄒoㄒ)/~~ 

今天来画南海海底地形图,之前用arcgis画过,但是感觉不太好看,尤其是arcgis的图例好丑啊🤣,还是转战python绘图啦!

好早之前画的啦,忘记参考的哪位大佬的了.....

import pandas as pd
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.patches as mpatches
plt.rcParams['axes.unicode_minus']=False  #显示负号
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["font.family"] = 'Arial'  #默认字体类型
mpl.rcParams["mathtext.fontset"] = 'cm' #数学文字字体
import xarray as xr
savepath = r'F:\wangxj\data\海山地形图\fig'
file=r'F:\wangxj\data\GEBCO_19_Sep_2023_e07f4a5eca45\gebco_2023_n25.0_s5.0_w105.0_e125.0.nc'
ds = xr.open_dataset(file)

输出ds看一下,因为我当时下载GEBCO文件时候就只截取了南海部分的数据,要是画别的地方的可能要改一下后面的经纬度范围。

 

#准备用于绘制地形图的数据
lon = np.linspace(min(ds['lon'].data), max(ds['lon'].data), len(ds['lon'].data))  # 经度
lat = np.linspace(min(ds['lat'].data), max(ds['lat'].data), len(ds['lat'].data))  # 纬度
#构建经纬网
lon, lat = np.meshgrid(lon, lat)
dem = ds['elevation'].data  # DEM数据

#站点观测数据读取
data = pd.read_excel(r'F:\wangxj\data\观测站点坐标.xlsx')
lon_points = data['lon'] 
lat_points = data['lat']
points = data['sites'] #站点编号

#plot---------------------------------------

plt.rcParams['font.sans-serif'] = ['Times New Roman']
fig=plt.figure(figsize=(8,8))

#创建底图,设置地图投影为World Plate Carrée,分辨率为高分辨率,地图范围为全球
m = Basemap(projection='cyl', resolution='l', llcrnrlon=105, llcrnrlat=5, urcrnrlon=122, urcrnrlat=25)

#设置地图经纬线,并只在左端和底端显示
m.drawmeridians(np.arange(105, 130, 5), labels=[0, 0, 0, 1], fontsize=10, linewidth=0.8, color='silver')  # 经线
m.drawparallels(np.arange(5, 30, 5), labels=[1, 0, 0, 0], fontsize=10, linewidth=0.8, color='silver')  # 纬线
#标注 珠江、黑潮等
plt.text(113,23,'PearlRiver',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=-25) 
plt.text(106,12.5,'MekongRiver',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=-65) 
plt.text(121,20,'KurishinoCurrent',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=90) 
#将站点数据的编号标注到地图上,为了彼此之间的标注不重合,最好错落标注。
for n in range(0,9):
    plt.text(lon_points[n], lat_points[n], str(points[n]), size=8,zorder=5,color='k')
for n in range(9,11):
    plt.text(lon_points[n], lat_points[n], str(points[n]), size=8,zorder=5,color='k',rotation=45)
#给SEATS站点绘制*号标志
m.scatter(lon_points[17], lat_points[17], marker='*', s=50, facecolor='r',edgecolor='k', linewidth=0.5,zorder=5)
plt.text(lon_points[17], lat_points[17]-0.5, 'SEATS',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center')

#绘制地图
#创建分级
levels = [ -4000, -2000, -1000, -200, -50, 0, 50, 200, 1000, 1500, 2000, 3000, 4000]
# 设置色带
color = [ '#4292c6', '#6baed6', '#9ecae1', '#c6dbef', '#deebf7', '#006837', 
         '#31a354', '#78c679', '#addd8e', '#d9f0a3', '#f7fcb9', '#c9bc87', '#a69165'] 
#绘制地形图
pcmesh=m.contourf(lon, lat, dem, levels=levels, extend='both', colors=color)
#绘制站点
m.scatter(lon_points, lat_points, marker='.', s=50, facecolor='r',
            edgecolor='r', linewidth=0.5)
# 设置图例
cbar3=fig.colorbar(pcmesh,pad=0.03,shrink=0.8,ticks=levels)
ax2=cbar3.ax
ax2.set_title('Depth(m)',fontsize=10)
ax2.tick_params(labelsize=10)
#绘制指北针
labelsize=10
loc_x=1
loc_y=1
width=1
height=1
pad=1
minx, maxx = (105,106)
miny, maxy = (23,24)
ylen = maxy - miny
xlen = maxx - minx
left = [minx + xlen*(loc_x - width*.5), miny + ylen*(loc_y - pad)]
right = [minx + xlen*(loc_x + width*.5), miny + ylen*(loc_y - pad)]
top = [minx + xlen*loc_x, miny + ylen*(loc_y - pad + height)]
center = [minx + xlen*loc_x, left[1] + (top[1] - left[1])*.4]
triangle = mpatches.Polygon([left, top, right, center], color='k')
plt.text(s='N',
        x=minx + xlen*loc_x,
        y=miny + ylen*(loc_y - pad + height),
        fontsize=labelsize,
        horizontalalignment='center',
        verticalalignment='bottom')
plt.gca().add_patch(triangle)

plt.savefig(r'F:\wangxj\data\The south China Sea elevation_1.png', dpi=300, bbox_inches='tight', pad_inches=0.1)  # 输出地图,并设置边框空白紧密
plt.show()  # 显示地图 

绘制完的图长这样子

为了好看一些,可以加一点观测数据的航行轨迹,还有珠江羽流的影响或者黑潮流的示意图或者南海季风系统等,大家可以根据实际需要,用PPT美化哈哈哈

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值