python绘制年平均海表温度、盐度、ph分布图

python绘制年平均海表温度、盐度、ph图


python绘制年平均海表温度、盐度、ph分布图

所属目录:紫菜

创建时间:2025/2/18

更新时间:2025/2/19

URL:https://blog.csdn.net/2301_78630677/article/details/145716784

前言

本文主要使用python绘制年平均海表温度、盐度、ph分布图,所用数据来源于Bio-ORACLE
参考文章:
Python绘制海表温度
【python海洋专题十二】年平均的南海海表面温度图

所用到的中国地图shp文件:
链接:https://pan.baidu.com/s/1q9hitI11CCYDWvBTWbAevg
提取码:9ju8

一、数据准备

Bio-ORACLE官网 下载所需的 2010-2020平均海表Ocean temperature、Salinity、pH数据
点击前往下载地址
在这里插入图片描述

下载下来的环境数据为.nc文件,也就是NetCDF格式。

‌NetCDF(Network Common Data Form)格式是一种用于存储和共享科学数据的标准格式,广泛应用于气象学、海洋学、地球科学等领域‌。.nc文件是NetCDF文件的扩展名,主要用于存储大型科学和工程数据集。

.nc文件的基本结构和特点
‌自描述性‌:.nc文件包含关于数据集的元数据,这些元数据描述了数据集的结构和内容,使得用户无需其他文档即可理解数据。
‌可移植性‌:.nc文件是二进制格式,能够在不同的平台上无缝迁移和使用。
‌多维数组结构‌:.nc文件通常包含多个维度,如时间、经度和纬度,适用于存储复杂的多维数据集。

补充:
所用的Bio-ORACLE环境数据合集(有需要就下载吧)
Bio-ORACLE数据分享[decade 2010-2020] [Surface layers]

二、代码编写

接下来主要讲述 python绘制年平均海表温度的代码,另外两个类似,只需要稍加修改

2.1. python绘制年平均海表温度(主要)

该代码用于绘制中国周边海域的海表温度(SST)分布图,并添加了省份边界、等温线和网格线等细节,最后保存pdf文件

import xarray as xr  
import matplotlib.pyplot as plt  
import cartopy.crs as ccrs  
import cartopy.feature as cfeature  
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter  # 导入经纬度格式器 
import numpy as np
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
# 加载NetCDF格式的SST数据(替换为你的SST数据文件路径)  
ds = xr.open_dataset(r"D:\oceandata\Bio-ORACLE\Temperature [mean].nc")  # 假设你的SST数据在该文件中  

print(ds.variables) #打印SST数据的所有变量名及其相关信息,通过查看这些信息,你可以确定要使用哪个变量进行绘图和分析

# 选择SST变量(替换为你的SST变量名)  
sst = ds['thetao_mean']
  
# 计算时间轴上的平均值(如果时间是一个维度)  
sst_mean = sst.mean(dim='time')  # 假设'time'是时间维度  

# 创建一个地图并设置投影  
fig = plt.figure(figsize=(10, 5))  
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())  

# 添加陆地和海洋特征  
ax.add_feature(cfeature.LAND, color='lightgray')  
ax.add_feature(cfeature.OCEAN, color='w', edgecolor='lightgray')  
ax.coastlines(color='black')  
# 添加省份边界
shapefile = r"C:\Users\www\Desktop\china_map\china_SHP\省界_Project.shp"  # 替换为你的Shapefile文件路径
china_provinces = ShapelyFeature(Reader(shapefile).geometries(), ccrs.PlateCarree(), edgecolor='black', facecolor='none')
ax.add_feature(china_provinces)

# 绘制SST平均值数据  
sst_plot = sst_mean.plot.contourf(ax=ax, transform=ccrs.PlateCarree(), cmap='coolwarm', levels=25, extend='both', add_colorbar=False,vmin=5, vmax=30)  
# levels参数可以调整等值线的数量  (具体来说,levels=25 表示将数据范围分成25个间隔,并绘制出相应的等值线。这些等值线将数据集的值范围(在此例中是5到30°C)平均分成25个部分,每个部分的上限和下限定义了一条等值线。)
  
  
# 添加颜色条  
cbar = fig.colorbar(sst_plot, drawedges=True, ax=ax, location='right', shrink=0.95, pad=0.08, spacing='uniform', label='Average Sea Surface Temperature (°C)')  
cbar.ax.tick_params(labelsize=10)  # 设置色标尺标签大小 

# 设置颜色条的刻度标签
cbar.set_ticks(np.arange(5, 31, 5))

# 添加等温线  
sst_contour = sst_mean.plot.contour(ax=ax, transform=ccrs.PlateCarree(), colors='gray', levels=130,linewidths=0.5)   # levels参数可以调整等温线的数量  

# 为等值线添加标签  
plt.clabel(sst_contour, inline=True, fontsize=10, fmt='%1.1f') 

# 设置地图的经纬度范围(可选)  
ax.set_extent([110, 135, 20, 40], crs=ccrs.PlateCarree())  

# 添加网格线  
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, xlocs=np.arange(110, 135, 5), ylocs=np.arange(20, 40, 5),
                  linewidth=0.5, linestyle='--', color='k', alpha=0.8)  # 添加网格线
gl.xlabels_top = False  
gl.ylabels_right = False  
gl.xformatter = LongitudeFormatter()  # 使用默认的经度格式器  
gl.yformatter = LatitudeFormatter()   # 使用默认的纬度格式器  
gl.xlabel_style = {'size': 10, 'color': 'black'}  
gl.ylabel_style = {'size': 10, 'color': 'black'}  
print("Map created successfully!")
# 保存地图为PDF文件
plt.savefig('scs_sst_1.pdf', dpi=600, bbox_inches='tight', pad_inches=0.1)
# 显示地图  
plt.show()

代码大概包括以下流程:

  1. 加载数据:读取 NetCDF 文件并提取 SST 变量。
  2. 数据处理:对时间维度取平均。
  3. 创建地图:设置投影、添加陆地和海洋特征、绘制省份边界。
  4. 绘制 SST 数据:绘制填充等温线和等温线,添加颜色条和标签。
  5. 设置地图范围与网格线:调整地图范围,添加网格线并格式化标签。
  6. 保存与显示:保存地图为 PDF 文件并显示。

print(ds.variables) #打印SST数据的所有变量名及其相关信息,通过查看这些信息,你可以确定要使用哪个变量进行绘图和分析
例如该SST数据包括四个变量:time、latitude、longitude、thetao_mean, 其中thetao_mean就是SST变量名。

在这里插入图片描述

结果显示
在这里插入图片描述

2.2. python绘制年平均海表盐度(选看)

以下代码与年平均海表温度的代码类似(一些注释信息就没改过来了,知道意思即可)


import xarray as xr  
import matplotlib.pyplot as plt  
import cartopy.crs as ccrs  
import cartopy.feature as cfeature  
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter  # 导入经纬度格式器 
import numpy as np
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
# 加载NetCDF格式的SST数据(替换为你的数据文件路径)  

ds = xr.open_dataset(r"D:\oceandata\so_baseline_2000_2019_depthsurf_49ed_5fc4_602c_U1739344920620_yandu.nc")  # 假设你的SST数据在该文件中  

print(ds.variables)
# 选择SST变量(替换为你的SST变量名)  
sst = ds['so_mean']
  
# 计算时间轴上的平均值(如果时间是一个维度)  
sst_mean = sst.mean(dim='time')  # 假设'time'是时间维度  

# 创建一个地图并设置投影  
fig = plt.figure(figsize=(10, 5))  
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())  

# 添加陆地和海洋特征  
ax.add_feature(cfeature.LAND, color='lightgray')  
ax.add_feature(cfeature.OCEAN, color='w', edgecolor='lightgray')  
ax.coastlines(color='black')  
# 添加省份边界
shapefile = r"C:\Users\www\Desktop\a5bc0-main\china_SHP\省界_Project.shp"  # 替换为你的Shapefile文件路径
china_provinces = ShapelyFeature(Reader(shapefile).geometries(), ccrs.PlateCarree(), edgecolor='black', facecolor='none')
ax.add_feature(china_provinces)


# 绘制SST平均值数据  
sst_plot = sst_mean.plot.contourf(ax=ax, transform=ccrs.PlateCarree(), cmap='coolwarm', levels=15, extend='both', add_colorbar=False,vmin=20, vmax=35)  # levels参数可以调整等温线的数量  
  
# 添加颜色条  
cbar = fig.colorbar(sst_plot, drawedges=True, ax=ax, location='right', shrink=0.95, pad=0.08, spacing='uniform', label='Average Sea Surface Salinity (psu)')  
cbar.ax.tick_params(labelsize=10)  # 设置色标尺标签大小 

# 设置颜色条的刻度标签
cbar.set_ticks(np.arange(20, 36, 3))


# 添加等温线  
sst_contour = sst_mean.plot.contour(ax=ax, transform=ccrs.PlateCarree(), colors='gray', levels=50,linewidths=0.5)  


# 为等值线添加标签  
plt.clabel(sst_contour, inline=True, fontsize=10, fmt='%1.1f') 

# 设置地图的经纬度范围(可选)  
ax.set_extent([110, 135, 20, 40], crs=ccrs.PlateCarree())  

# 添加网格线  
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, xlocs=np.arange(110, 135, 5), ylocs=np.arange(20, 40, 5),
                  linewidth=0.5, linestyle='--', color='k', alpha=0.8)  # 添加网格线
gl.xlabels_top = False  
gl.ylabels_right = False  
gl.xformatter = LongitudeFormatter()  # 使用默认的经度格式器  
gl.yformatter = LatitudeFormatter()   # 使用默认的纬度格式器  
gl.xlabel_style = {'size': 10, 'color': 'black'}  
gl.ylabel_style = {'size': 10, 'color': 'black'}  
print("Map created successfully!")

# 保存地图为PDF文件
plt.savefig('scs_yandu_1.pdf', dpi=600, bbox_inches='tight', pad_inches=0.1)
# 显示地图  
plt.show()

在这里插入图片描述

2.3. python绘制年平均海表ph(选看)

以下代码与年平均海表温度的代码类似,只不过因为ph的值较小,我们可以先计算一下数据中的最大值与最小值,方便确定ph大小


import xarray as xr  
import matplotlib.pyplot as plt  
import cartopy.crs as ccrs  
import cartopy.feature as cfeature  
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter  # 导入经纬度格式器 
import numpy as np
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
# 加载NetCDF格式的SST数据(替换为你的SST数据文件路径)  

ds = xr.open_dataset(r"D:\oceandata\ph_baseline_2000_2018_depthsurf_f606_6dc8_6180_U1739344995788_ph.nc")  # 假设你的SST数据在'sst.nc'文件中  

# 选择pH变量(替换为你的pH变量名)  
ph = ds['ph_mean']

# 计算pH数据的最高和最低值
ph_max = ph.max(dim=['time', 'latitude', 'longitude'])
ph_min = ph.min(dim=['time', 'latitude', 'longitude'])

print("Maximum pH value:", ph_max)
print("Minimum pH value:", ph_min)

print(ds.variables)
# 选择SST变量(替换为你的SST变量名)  
sst = ds['ph_mean']
  
# 计算时间轴上的平均值(如果时间是一个维度)  
sst_mean = sst.mean(dim='time')  # 假设'time'是时间维度  

# 创建一个地图并设置投影  
fig = plt.figure(figsize=(10, 5))  
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())  

# 添加陆地和海洋特征  
ax.add_feature(cfeature.LAND, color='lightgray')  
ax.add_feature(cfeature.OCEAN, color='w', edgecolor='lightgray')  
ax.coastlines(color='black')  
# 添加省份边界
shapefile = r"C:\Users\王浩天\Desktop\a5bc0-main\china_SHP\省界_Project.shp"  # 替换为你的Shapefile文件路径
china_provinces = ShapelyFeature(Reader(shapefile).geometries(), ccrs.PlateCarree(), edgecolor='black', facecolor='none')
ax.add_feature(china_provinces)


# 绘制SST平均值数据  
sst_plot = sst_mean.plot.contourf(ax=ax, transform=ccrs.PlateCarree(), cmap='coolwarm', levels=15, extend='both', add_colorbar=False,vmin=8, vmax=8.2)  # levels参数可以调整等温线的数量  
  
# 添加颜色条  
cbar = fig.colorbar(sst_plot, drawedges=True, ax=ax, location='right', shrink=0.95, pad=0.08, spacing='uniform', label='Average Sea Surface pH')  
cbar.ax.tick_params(labelsize=10)  # 设置色标尺标签大小 

# 设置颜色条的刻度标签
cbar.set_ticks(np.arange(8, 8.25, 0.05))


# 添加等温线  
sst_contour = sst_mean.plot.contour(ax=ax, transform=ccrs.PlateCarree(), colors='gray', levels=200,linewidths=0.5)  


# 为等值线添加标签  
plt.clabel(sst_contour, inline=True, fontsize=10, fmt='%1.3f')  #保留小数点后三位

# 设置地图的经纬度范围(可选)  
ax.set_extent([110, 135, 20, 40], crs=ccrs.PlateCarree())  

# 添加网格线  
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, xlocs=np.arange(110, 135, 5), ylocs=np.arange(20, 40, 5),
                  linewidth=0.5, linestyle='--', color='k', alpha=0.8)  # 添加网格线
gl.xlabels_top = False  
gl.ylabels_right = False  
gl.xformatter = LongitudeFormatter()  # 使用默认的经度格式器  
gl.yformatter = LatitudeFormatter()   # 使用默认的纬度格式器  
gl.xlabel_style = {'size': 10, 'color': 'black'}  
gl.ylabel_style = {'size': 10, 'color': 'black'}  
print("Map created successfully!")
# 保存地图为PDF文件
plt.savefig('scs_ph_1.pdf', dpi=600, bbox_inches='tight', pad_inches=0.1)
# 显示地图  
plt.show()

在这里插入图片描述

总结

主要是以绘制年平均海表温度分布图为例,其余环境数据也类似。

2025/2/19

### 海洋盐度数据可视化 对于海洋盐度数据可视化,可以采用多种Python库来完成这一任务。GeoPandas和Folium适用于构建地理息系统并提供基础的地图支持;而Basemap和Cartopy则擅长于地图绘制与空间数据分析[^1]。然而,在具体到盐度这样的专题绘图时,Plotly因其强大的图形渲染能力和易于使用的API成为不错的选择之一。 下面是一个简单的例子,展示了如何加载Excel格式的海洋观测数据,并使用Plotly创建一个示不同位置处盐度分布情况的地图图: ```python import pandas as pd import plotly.graph_objects as go # 假设已经有一个名为dataframe的对象包含了经纬度及对应的盐度测量值 df = pd.read_excel("path_to_your_file.xlsx") # 替换为实际路径 fig = go.Figure(data=go.Scattergeo( lon=df['longitude'], # 经度列 lat=df['latitude'], # 纬度列 text=df['salinity'].apply(lambda x: f'Salinity: {x} PSU'), # 显示的息 mode='markers', marker=dict( size=8, opacity=0.8, reversescale=True, autocolorscale=False, symbol='circle', line=dict(width=1,color='rgba(102, 102, 102)'), cmin=30, # 设置颜色刻度范围下限 color=df['salinity'], cmax=40 # 设置颜色刻度范围上限 ) )) fig.update_layout( title_text="Global Sea Surface Salinity", geo=dict( scope='world', projection_type='natural earth' ), ) fig.show() ``` 此段代码首先从指定文件中读取了包含经度、纬度以及相应地点上所记录下来的盐度数值的数据集。接着定义了一个`Scattergeo`类型的图对象,它能够基于地理位置息在世界地图上来显示各个采样点的位置及其代的颜色深浅反映了当地域内的平均盐浓度水平。最后调用了`.show()`方法使得成后的交互式HTML页面可以直接弹出浏览器窗口查看效果[^2]。 为了进一步增强这种视觉达的效果,还可以考虑引入更多维度的息比如时间序列的变化趋势或是与其他物理化学性质之间的关系研究等,这可以通过增加额外的图组件或者是利用更复杂的多变量分析工具来进行深入探讨[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星石传说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值