【科研绘图】记录一次论文结果复现

news2024/11/20 19:37:31

复现原论文中的图片是科研的基本功之一,它不仅验证了研究结果的可靠性,确保了科学工作的准确性和可重复性,还深刻地评估了方法的有效性,体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度,促进了科学交流和进步,更在细致的操作中提升了个人和团队的技能。通过精确复现图形,研究者能够在继承和创新中不断推动科学领域的发展,为后续的研究奠定坚实的基础,体现了科研工作中的严谨与追求卓越。

任务:

给定海水温度数据(cmems_mod_glo_phy_my_0.083deg_P1M-m_thetao_70.00W-54.00W_70.00S-61.00S_0.49-902.34m_1993-01-01-2021-06-01.nc)和研究区域矢量(Ocean_roi_03.shp),请使用这些数据绘制如下示例图(黑线和灰色线不需要)。
在这里插入图片描述

原论文:

Wallis B J, Hogg A E, Meredith M P, et al. Ocean warming drives rapid dynamic activation of marine-terminating glacier on the west Antarctic Peninsula[J]. Nature Communications, 2023, 14(1): 7535.

绘制思路:

目标是从 NetCDF 文件中读取海洋温度数据,并结合 Shapefile 文件定义的区域掩膜,筛选出特定深度和地理区域内的数据,计算温度异常,并绘制结果图。具体步骤如下:

  1. 导入库

    • matplotlib.pyplot 用于绘图。
    • numpy 用于数组操作。
    • xarray 用于处理 NetCDF 数据。
    • geopandas 用于处理 Shapefile 文件。
    • salem 用于地理数据操作和掩膜。
  2. 读取数据

    • 使用 xarray 打开 NetCDF 文件,读取海洋温度数据 (thetao) 和深度数据 (depth)。
    • 使用 geopandas 读取 Shapefile 文件,获取感兴趣区域的边界框。
  3. 筛选数据

    • 根据 Shapefile 边界框的经纬度范围,筛选出在该区域内的温度数据。
    • 将深度数据限制在 0 到 500 米之间。
  4. 创建掩膜

    • 使用 salem 创建 Shapefile 区域的掩膜,并将其应用到筛选后的温度数据上。
  5. 处理空白数据

    • 对掩膜后的数据进行插值处理,填补时间和深度维度上的空白数据。
  6. 补全深度数据

    • 如果深度数据的最大值小于 500 米,则使用最近邻方法补全数据,使其覆盖 0 到 500 米的范围。
  7. 计算温度平均值和异常值

    • 计算每个月的平均温度。
    • 计算每个数据点的温度异常,即实际温度减去月平均温度。
  8. 定义颜色映射表

    • 自定义颜色映射表,将温度异常值映射到相应的颜色。
  9. 设置颜色条

    • 定义颜色条的分界线,使颜色条反映温度异常值的范围(-2°C 到 2°C)。
  10. 创建图形

    • 创建一个大小为 17x5 英寸的图形。
    • 提取月份和深度数据。
    • 计算每个深度层的平均温度异常值。
  11. 绘制温度异常图

    • 使用 pcolormesh 方法绘制温度异常值的网格图。
    • 添加颜色条,并设置颜色条的标签和刻度。
  12. 设置坐标轴标签和刻度

    • 设置纵轴标签为“Depth (m)”,字体为 Times New Roman,字号为 20。
    • 反转纵轴,使深度从 500 米到 0 米。
    • 设置纵轴刻度为每 100 米一档,字体为 Times New Roman,字号为 20。
    • 设置横轴为特定年份刻度,字体为 Times New Roman,字号为 20。

复现结果:

在这里插入图片描述

源代码:

import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
import geopandas as gpd
import salem
from matplotlib.colors import LinearSegmentedColormap, BoundaryNorm
import warnings
warnings.filterwarnings("ignore")

# 打开 NetCDF 文件
file_path = 'D:/PyProject/Plot/cmems_mod_glo_phy_my_0.083deg_P1M-m_thetao_70.00W-54.00W_70.00S-61.00S_0.49-902.34m_1993-01-01-2021-06-01.nc'
data = xr.open_dataset(file_path)

# 打开 Shapefile
shapefile_path = 'D:/PyProject/Plot/Ocean_roi_03.shp'
shape = gpd.read_file(shapefile_path)

# 获取 Shapefile 的边界框
minx, miny, maxx, maxy = shape.total_bounds

# 筛选出在 Shapefile 边界框内的温度数据
temperature_data = data['thetao'].sel(longitude=slice(minx, maxx), latitude=slice(miny, maxy))

# 假设深度数据存在于 depth 变量中
depth = data['depth']
temperature_data = temperature_data.sel(depth=slice(0, 500))

# 创建一个 Shapefile 区域的掩模
roi = salem.read_shapefile(shapefile_path)
masked_temperature_data = temperature_data.salem.roi(shape=roi)

# 插值处理空白数据
masked_temperature_data = masked_temperature_data.interpolate_na(dim='time', method='linear')
masked_temperature_data = masked_temperature_data.interpolate_na(dim='depth', method='linear')

# 补全深度到500米
max_depth = masked_temperature_data['depth'].max().values
if max_depth < 500:
    additional_depths = np.arange(max_depth + 1, 501)
    additional_data = masked_temperature_data.isel(depth=-1).expand_dims('depth').reindex({'depth': additional_depths}, method='nearest')
    masked_temperature_data = xr.concat([masked_temperature_data, additional_data], dim='depth')

# 计算每月的平均温度
monthly_mean_temperature = masked_temperature_data.groupby('time.month').mean('time')

# 计算每个点的温度异常
temperature_anomaly = masked_temperature_data.groupby('time.month') - monthly_mean_temperature

# 自定义颜色映射表
colors = [
    (0.0, (0.055, 0.224, 0.422)),  # 深蓝色,代表-2度
    (0.25, '#6699cc'),
    (0.5, 'white'),
    (0.75, '#ff3300'),
    (1.0, (0.4, 0.122, 0.118))  # 深红色,代表2度
]
custom_cmap = LinearSegmentedColormap.from_list('custom_cmap', colors)

# 设置颜色条的分界线
boundaries = np.linspace(-2, 2, 17)  # 16个色块
norm = BoundaryNorm(boundaries, custom_cmap.N, clip=True)

# 创建图形
fig, ax = plt.subplots(figsize=(17, 5))

# 提取月份和深度数据
months = masked_temperature_data['time'].values
depths = masked_temperature_data['depth'].values

# 计算每个深度层的平均温度异常
temperature_anomaly_mean = temperature_anomaly.mean(dim=['longitude', 'latitude']).transpose()

# 创建pcolormesh图,设置颜色条的范围
c = ax.pcolormesh(months, depths, temperature_anomaly_mean, cmap=custom_cmap, norm=norm, shading='auto')

# 添加颜色条
cbar = fig.colorbar(c, ax=ax, boundaries=boundaries, extend='both')
cbar.set_label('Potential Temp Anomaly (C)', fontsize=20, fontname='Times New Roman')

# 设置颜色条刻度
cbar.set_ticks([-2, -1, 0, 1, 2])
cbar.ax.set_yticklabels(['-2', '-1', '0', '1', '2'], fontsize=20, fontname='Times New Roman')

# 设置轴标签和标题
# ax.set_xlabel('Year', fontsize=12, fontname='Times New Roman')
ax.set_ylabel('Depth (m)', fontsize=20, fontname='Times New Roman')
# ax.set_title('Monthly Temperature Anomaly', fontsize=14, fontname='Times New Roman')

# 反转纵轴并设置刻度
ax.set_ylim(500, 0)
ax.set_yticks([500, 400, 300, 200, 100, 0])
ax.set_yticklabels([500, 400, 300, 200, 100, 0], fontsize=20, fontname='Times New Roman')

# 设置特定的年份刻度和标签
years = [1995, 2000, 2005, 2010, 2015, 2020]
ax.set_xticks([np.datetime64(str(year)) for year in years])
ax.set_xticklabels(years, fontsize=20, fontname='Times New Roman')

# 设置字体
plt.xticks(fontsize=20, fontname='Times New Roman')

# 保存图形,提高分辨率
fig.savefig('temperature_anomaly.png', dpi=600)  # 设置图像分辨率为600 DPI

# 显示图形
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科普文:docker基础概念、软件安装和常用命令

docker基本概念 一 容器的概念 1. 什么是容器&#xff1a;容器是在隔离的环境里面运行的一个进程&#xff0c;这个隔离的环境有自己的系统目录文件&#xff0c;有自己的ip地址&#xff0c;主机名等。也可以说&#xff1a;容器是一种轻量级虚拟化的技术。 2. 容器相对于kvm虚…

计算机组成原理--慕课网学习笔记

本文记录了学习慕课网课程【新版】计算机基础&#xff0c;计算机组成原理操作系统网络时的计算机组成原理篇的笔记&#xff0c;方便查阅复习使用 一、概述篇 1.1 计算机的发展历史 1&#xff09;计算机发展的四个阶段 ①第一个阶段&#xff1a;电子管计算机 背景&#xff1a…

一文掌握什么是时间序列?时间序列研究的核心任务?目前最强大的时序分析与建模工具和项目?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 什么是时间序列? 时间序列是一系列按照时间顺序排列的数据点,这些数据点通常是随时间连续变化的测量值。时间序列分析是统计学中专门用于解析时间顺序数据的一套技术,旨在识别数据中的模式、趋势、季节性波动及其他潜在…

计算机网络:构建联结的基础

目录 1. 网络拓扑结构 1.1 星型拓扑 1.2 环型拓扑 1.3 总线型拓扑 1.4 网状拓扑 2. 传输介质 2.1 双绞线 2.2 同轴电缆 2.3 光纤 2.4 无线电波 3. 协议栈模型 3.1 OSI模型 3.2 TCP/IP模型 4. 网络设备 4.1 交换机 4.2 路由器 4.3 网关 4.4 防火墙 5. IP地址…

Linux下Centos7中的gcc/g++

命为志存。 —— 朱熹 Linux中C/C翻译过程 1、样例介绍1、1、gcc版本过低不能编译成功1、2、编写 .cxx或.cc或.cpp代码(都是C) 2、程序的翻译过程2、1、条件编译(补充)2、2、语言历史 3、深入理解链接3、1、静态链接的使用场景 1、样例介绍 1、1、gcc版本过低不能编译成功 in…

QT vs2019编译报错LNK2019无法解析的外部符号

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: __cdecl Dialog_Setting::Dialog_Setting(class QWidget *)" (??0Dialog_SettingQEAAPEAVQWidgetZ)&#xff0c;函数 "public: __cdecl QtWid…

全感知、全覆盖、全智能的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI安全管理平台&…

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…

Vue2.

vue2 模版语法 插值语法 标签体内容 指令语法 标签属性 v-bind: >> : 绑定 数据绑定 el与data的两种写法 理解MVVM模型 vue实例对象中的_proto_属性内 是 vue原型对象上的方法 数据代理 回顾object.defineproperty方法 数据代理定义&#xff1a; vue中的数据…

dify(docker)配置域名访问配置https

1. 要把证书放到 容器里面 放到nginx的目录里面 这个是在windows下 如果在Linux下 先上传到Linux服务器上然后复制到容器里面 docker-nginx-1 为容器的名字 2. 修改conf.d 里面的 default.conf 配置文件 把注释的代码放出来 3. 修改yaml文件 修改dify-main\docker下…

react中useReducer钩子函数的使用

1.代码展示 import { useReducer } from "react"// 1.定义reducer函数&#xff0c;根据不同action返回不同状态 function reducer(state, action) {console.log(state, action);switch (action.type) {case "INC":return state 1break;case "DEC&qu…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

CTF-NSSCTF[NISACTF 2022]

[NISACTF 2022]middlerce 考察&#xff1a;正则匹配回溯绕过 这里使用的是正则匹配的NIF匹配引擎,这个匹配引擎的原理是基于从后往前回溯的匹配机制 NIF匹配机制 当preg_match这个函数进行匹配时是匹配完后才根据匹配到与否来返回bool值 如果匹配到也要匹配完后才返回true,…

linux mysql 定时备份

1、创建备份文件夹 cd /homemkdir backup2、创建脚本文件 vim bkDatabaseName.sh加入以下内容&#xff08;/xp/server/mysql/bin/mysqldump是你的mysqldump备份命令&#xff0c;一般如果是正常安装的&#xff0c;可以直接用全局命令mysqldump&#xff0c;不用带前面的路径&am…

【前端 02】新浪新闻项目-初步使用CSS来排版

在今天的博文中&#xff0c;我们将围绕“新浪新闻”项目&#xff0c;深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例&#xff0c;我们将学习如何设置图片、标题、超链接以及文本排版&#xff0c;同时了解CSS的引入方式和选择器优先级&#xff0c;以及视频和音频标签的…

19.延迟队列优化

问题 前面所讲的延迟队列有一个不足之处&#xff0c;比如现在有一个需求需要延迟半个小时的消息&#xff0c;那么就只有添加一个新的队列。那就意味着&#xff0c;每新增一个不同时间需求&#xff0c;就会新创建一个队列。 解决方案 应该讲消息的时间不要跟队列绑定&#xf…

介绍一款适合于程序员的手机浏览器

DT浏览器是一款适合于程序员的手机浏览器&#xff0c;主要功能有&#xff0c;资料分类收藏&#xff0c;图片资料转文字&#xff0c;智能问答&#xff0c;视频资料管理和播放&#xff0c;笔记本&#xff0c; DT浏览器使用教程之如何查空气质量&#xff0c; 在DT浏览器首页点空…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…

第03课 Scratch入门篇: 键盘控制小猫

键盘控制小猫 入门篇适合新手&#xff0c;如您已经学过&#xff0c;可以忽略本节课&#xff01; 1、故事背景&#xff1a; 悠闲的小猫在舞台中散步&#xff0c;左左右右&#xff0c;上上下下… 2、实现原理&#xff1a; 让我们一起分析下&#xff0c;如何通过程序来…