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

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

任务:

给定海水温度数据(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.rhkb.cn/news/384685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 中安装内网穿透工具ngrok

ngrok 是什么&#xff1f; Ngrok 是一个网络工具&#xff0c;主要用于在网络中创建从公共互联网到私有或本地网络中运行的web服务的安全隧道。它充当了一个反向代理&#xff0c;允许外部用户通过公共可访问的URL访问位于防火墙或私有网络中的web应用程序或服务。Ngrok 特别适用…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十九章 等待队列

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Java数据结构与算法--链表(Linked List)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java SE关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 深入了解链表&#xff1a; 链表是一种常见的数据结构&#xff0c;它由一系列节点…

【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !

目录 C语言指针精讲1. 什么是指针&#xff1f;1.1 指针的内存模型1.1.1 指针演示输出 1.2 指针运算1.2.1 指针算术运算输出1.2.2 指针与数组的关系输出 1.3 指针类型1.3.1 不同类型的指针示例输出1.3.2 void 指针输出 1.4 指针与内存管理动态内存分配输出 1.5 指针与内存泄漏1.…

Android进阶之NDK开发,保姆级教程

目录 前言NDK下载CMake文件创建指定ABI架构编写CMake文件编写JNI方法Java调用CC调用Java 生成JNI头文件实现对应C方法编译so文件编写demo验证运行效果总结 前言 作为Android应用开发从业者来说&#xff0c;掌握NDK开发是必备技能之一&#xff0c;本文将从NDK环境下载&#xff…

均匀圆形阵列原理及MATLAB仿真

均匀圆形阵列原理及MATLAB仿真 目录 前言 一、均匀圆阵原理 二、圆心不存在阵元方向图仿真 三、圆心存在阵元方向图仿真 四、MATLAB仿真代码 总结 前言 本文详细推导了均匀圆形阵列的方向图函数&#xff0c;对圆心不放置阵元和圆心放置阵元的均匀圆形阵列方向图都进行了仿…

PySide(PyQt)的QPropertyAnimation(属性动画)

学不完&#xff0c;根本学不完:(&#xff0c;感觉逐渐陷入了学习深渊。。。 QPropertyAnimation 是 PySide(PyQt) 中一个用于在时间轴上平滑地改变对象属性的类。它常用于制作动画效果&#xff0c;比如移动、缩放或改变透明度等。 基本概念 QPropertyAnimation 是 Qt …

03。正式拿捏ArkTS语言第一天

1, 打印日志命令 &#xff1a; console.log() 2, 三种基本数据类型&#xff1a; number 数字类型 &#xff08;数字&#xff09; string 字符串类型&#xff08;例如&#xff1a;“我是字符串”&#xff09; boolean 布尔类型 (true 或者 false) ***…

昇思25天学习打卡营第24天|RNN实现情感分类

RNN实现情感分类学习总结 概述 情感分类是自然语言处理领域的重要任务&#xff0c;主要用于识别文本中表达的情绪。本文使用MindSpore框架实现基于RNN的情感分类模型&#xff0c;示例包括&#xff1a; 输入: “This film is terrible” -> 标签: Negative输入: “This fi…

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接&#xff1a;https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码&#xff1a;Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…

Linux shell编程学习笔记66:ping命令 超详细的选项说明

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究最常用的ping命令。 1 ping命令 的功能、格式和选项说明 1.1 ping命令 的功能 简单来说&#xff0c; ping 命令 会…

Linus: vim编辑器的使用,快捷键及配置等周边知识详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 vim的安装创建新用户 adduser 用户名Linus是个多用户的操作系统是否有创建用户的权限查看当前用户身份:whoami** 怎么创建设置密码passwdsudo提权(sudo输入的是用户…

日记审计遵守合规安全要求

一、什么是日志审计系统 日记审计系统是一种用于记录、监视和分析系统日志的工具或系统。它主要用于帮助组织实时监控与分析各种事件和行为的日志记录&#xff0c;以便检测潜在的安全威胁&#xff0c;了解系统性能和进行故障排除。日志审计系统通常能够收集、存储和分析来自各…

.env.local 配置本地环境变量 用于团队开发

.env.local 用途&#xff1a;.env.local 通常用于存储本地开发环境中的环境变量。这些变量可能包括敏感数据或特定于单个开发者的设置&#xff0c;不应该被提交到版本控制系统中。优先级&#xff1a;在大多数框架中&#xff0c;.env.local 文件中的变量会覆盖其他 .env 文件中…

vite环境下使用bootstrap

环境 nodejs 18 pnpm 初始化 pnpm init pnpm add -D vite --registry http://registry.npm.taobao.org pnpm add bootstrap popperjs/core --registry http://registry.npm.taobao.org pnpm add -D sass --registry http://registry.npm.taobao.org新建vite.config.js cons…

opencv 按键开启连续截图,并加载提示图片

背景图小图 键盘监听使用的是pynput 库 保存图片时使用了年月日时分秒命名 原图&#xff1a; from pynput import keyboard import cv2 import time# 键盘监听 def on_press(key):global jieglobal guanif key.char a:jie Trueelif key.char d:jie Falseelif key.char…

SpringBoot启动命令过长

Error running DromaraApplication: Command line is too long. Shorten command line for DromaraApplication or also for Spring Boot default configuration?

LeetCode 热题 HOT 100 (010/100)【宇宙最简单版】

【链表】No. 0206 反转链表 【简单】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

轻松学EntityFramework Core--模型创建

一、使用代码优先&#xff08;Code-First&#xff09;创建模型 Code-First 方法是 EF Core 提供的一种用于定义模型的方式&#xff0c;它允许开发人员通过编写 C# 类来定义数据库模式&#xff0c;再通过迁移命令生成数据库表。下面我们来一起看一下代码优先如何使用。 1.1、创…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…