【科研绘图复刻】台风路径+浮标路径+断面综合地图展示

引言

碎碎念:闲来无事,想要锻炼自己的绘图能力,正好看到有篇论文的图还蛮特别的,主要是涉及不同要素在地图上的运动路径,可用 MATLAB 的 m_map 进行绘图,正好拿来练练手。

先上图片

该图引用自:Lin, J.; Sun, Q.; Liu, Y.; Ye, H.; Tang, D.; Zhang, X.; Gao, Y. Sea Surface pCO2 Response to Typhoon "Wind Pump" and Kuroshio Intrusion in the Northeastern South China Sea. Remote Sens. 2024, 16, 123. https://doi.org/10.3390/rs16010123

复刻思路

图中主要要素

复刻图片,首先要弄清楚图面里有什么,需要什么数据才能绘制。该图主要有:

2011年8月台风南玛都:时间、经纬度、风速

Argo路径:经纬度

现场调查断面:经纬度数据

复刻所需材料

实现工具

Matlab

复刻过程中需要用到 m_map,这个不是 MATLAB 自带的,需要提前安装。安装教程请自行在网上搜索或者问 AI。

数据

台风数据

YEARMONTHDAYTIMELATLONWIND
20118221214.7111127.62225
20118221815.1636127.54530
……………………………………
20118301224.4533119.07340
20118301824.5538118.93835

Argo数据

LONLAT
120.320819.9109
…………
120.475119.92852

断面数据

LONLAT
120.015921.41596
…………
120.015920.43256

台风路径复刻方法

显然台风路径很像映射了颜色的散点图,这就需要调用 m_scatter 函数。几个散点并且有折线相连,m_line 正好派上用场。这两个函数的用法类似于 scatter 和 line,入门难度不大。

绘图之前先读取数据

data_typhoon = xlsread('DATA.xls','Typhoon');
ty_mon = data_typhoon(:,2);
ty_days = data_typhoon(:,3);
ty_lon = data_typhoon(:,6);
ty_lat = data_typhoon(:,5);
ty_velocity = data_typhoon(:,7);

选定图画范围

fig1=figure;
m_proj('equidistant','lon',[115 130],'lat',[15 30]); 

台风路径线迹

for i=2:length(ty_lon)
    m_line(ty_lon(i-1:i),ty_lat(i-1:i),'LineStyle','-','LineWidth',0.8);
    hold on
end 

台风速度可视化

for j=1:length(ty_lon)
    m_scatter(ty_lon(j),ty_lat(j),50,ty_velocity(j),'filled','Marker','o');
    hold on
end 

日期标签的显示

for t=1:length(ty_lon)
    m_text(ty_lon(t)+0.1,ty_lat(t),[num2str(ty_mon(t)),'/',num2str(ty_days(t))]);
end 

地形的显示

m_gshhs_i('linewidth',1,'color','k');
m_gshhs_i('patch',[.5,.5,.5]);
m_grid('linestyle','none','tickdir','out','linewidth',1.5,'fontsize',16);

Argo路径以及断面复刻方法

与上类似,但这两个不需要可视化速度,所以直接使用m_line即可。以Argo1为例,它的起始点以五角星作为标志,每个位置以方框作为显示。画图有稍稍的不同,只需要把第一个

for m1=2:length(argo1_lon)
    m_line(argo1_lon(m1-1:m1),argo1_lat(m1-1:m1),'Color',[0.8500 0.3250 0.0980],...
        'Marker','square','LineStyle','-','LineWidth',0.8);
    hold on
end
m_scatter(argo1_lon(1),argo1_lat(1),90,'Marker','Pentagram','MarkerEdgeColor',[0.8500 0.3250 0.0980]);

完整复刻

代码

clc;clear;

%% 读取数据
data_typhoon = xlsread('DATA.xls','Typhoon');
ty_mon = data_typhoon(:,2);
ty_days = data_typhoon(:,3);
ty_lon = data_typhoon(:,6);
ty_lat = data_typhoon(:,5);
ty_velocity = data_typhoon(:,7);

data_Argo1 = xlsread('DATA.xls','Argo1');
argo1_lon = data_Argo1(:,1);
argo1_lat = data_Argo1(:,2);

data_Argo2 = xlsread('DATA.xls','Argo2');
argo2_lon = data_Argo2(:,1);
argo2_lat = data_Argo2(:,2);

data_Dm = xlsread('DATA.xls','断面');
Dm_lon = data_Dm(:,1);
Dm_lat = data_Dm(:,2);

%% 绘图
% 投影
fig1=figure;
m_proj('equidistant','lon',[115 130],'lat',[15 30]); 

% Argo路径
for m1=2:length(argo1_lon)
    m_line(argo1_lon(m1-1:m1),argo1_lat(m1-1:m1),'Color',[0.8500 0.3250 0.0980],...
        'Marker','square','LineStyle','-','LineWidth',0.8);
    hold on
end
m_scatter(argo1_lon(1),argo1_lat(1),90,'Marker','Pentagram',...
    'MarkerFaceColor',[0.8500 0.3250 0.0980],'MarkerEdgeColor',[0.8500 0.3250 0.0980]);
m_text(argo1_lon(1),argo1_lat(1)-0.2,'Argo1','Color',[0.8500 0.3250 0.0980],'fontsize',8);

for m2=2:length(argo2_lon)
    m_line(argo2_lon(m2-1:m2),argo2_lat(m2-1:m2),'Color',[0.6350 0.0780 0.1840],...
        'Marker','square','LineStyle','-','LineWidth',0.8);
    hold on
end
m_scatter(argo2_lon(1),argo2_lat(1),90,'Marker','Pentagram',...
    'MarkerFaceColor',[0.6350 0.0780 0.1840],'MarkerEdgeColor',[0.6350 0.0780 0.1840]);
m_text(argo2_lon(1),argo2_lat(1)+0.2,'Argo2','Color',[0.6350 0.0780 0.1840],'fontsize',8);
hold on

% 断面
for n1=2:length(argo2_lon)
    m_line(Dm_lon(n1-1:n1),Dm_lat(n1-1:n1),'Color','k','Marker','^','LineStyle','-','LineWidth',0.8);
    hold on
end
for n2=1:length(argo2_lon)
    m_text(Dm_lon(n2)-0.5,Dm_lat(n2)+0.05,['S',num2str(n2)],'Color','k','fontsize',9);
    hold on
end
m_text(Dm_lon(n2)-1.35,Dm_lat(n2)-0.3,'Transect A','Color','k','fontsize',9,'fontweight','bold');
hold on

m_gshhs_i('linewidth',1,'color','k');
m_gshhs_i('patch',[.5,.5,.5]);
m_grid('linestyle','none','tickdir','out','linewidth',1.5,'fontsize',16);

% 台风路径
for i=2:length(ty_lon)
    m_line(ty_lon(i-1:i),ty_lat(i-1:i),'Color','k','LineStyle','-','LineWidth',1);
    hold on
end 
for j=1:length(ty_lon)
    m_scatter(ty_lon(j),ty_lat(j),50,ty_velocity(j),'filled','Marker','o');
    hold on
end 
c=colorbar; 
set(get(c,'ylabel'),'string','WindSpeed (m/s)');
set(c,'location','east','axislocation','out','linewidth',1,'fontsize',12,'edgecolor','k');
hold on 
for t=2:4:length(ty_lon)
    m_text(ty_lon(t)+0.1,ty_lat(t),[num2str(ty_mon(t)),'/',num2str(ty_days(t))],'fontsize',9);
end 

% 地理标签
m_text(115.6,24.2,'China','Color','k','fontsize',13,'fontweight','bold');
m_text(120.3,23.7,'Taiwan Island','Color','k','fontsize',13,'fontweight','bold');
m_text(120.1,16.6,'Luzon Island','Color','k','fontsize',13,'fontweight','bold');

结果

最后的成果图大概就是这样啦!

最后的话:

由于太多标签了,每一个都在代码里面调太麻烦了,最后可以通过手动调整达到想要的效果。具体是点击下图红圈部分,再点击标签,拖动调整位置即可,另外colorbar也可以调整位置及大小。

内容概要:本文围绕“空地多无人平台协同路径规划技术”的论文复现展开,重点介绍了基于Matlab的多无人机与地面无人平台协同路径规划的算法实现与仿真研究。研究系统性地整合了无人机三维路径规划、动态避障、多机协同、任务分配及防撞机制等核心技术,结合智能优化算法(如遗传算法、粒子群算法、灰狼优化算法等)与经典路径规划模型(如Dubins路径、A*、RRT等),在复杂威胁环境下实现了高效、安全的协同路径规划。文中提供了完整的Matlab代码支持,便于科研人员进行算法验证、性能对比与二次开发,并强调通过复现高水平学术论文(如EI、SCI期刊及硕博论文)深入掌握该领域的前沿方法与技术路线。; 适合人群:具备一定Matlab编程基础,从事无人机系统、自动化控制、人工智能、路径规划等相关领域研究的研究生、科研人员及工程技术人员,尤其适用于正在开展科研项目、撰写学位论文或希望提升算法实践能力的研究者。; 使用场景及目标:① 复现并深入理解空地协同路径规划领域的高水平论文算法;② 掌握Matlab在多智能体路径规划中的建模、仿真与可视化方法;③ 应用于科研课题、毕业设计、项目申报及算法创新实践中,提升研究的技术深度与工程可行性。; 阅读建议:建议结合文中提供的网盘资源(含完整代码、仿真模型及参考文献资料)同步学习,优先选择与自身研究方向契合的案例进行复现,注重算法原理与代码实现之间的映射关系,并在掌握基础方案后尝试进行参数调优、算法融合或引入新约束条件以实现改进与创新。
内容概要:本文基于Android 15_r17源码深度解析Binder机制的核心原理与实现流程,涵盖Binder驱动交互、服务注册与获取、跨进程通信流程及关键类的作用。文章详细剖析了首个Binder服务ServiceManager的启动与发布过程,阐明其作为上下文管理者通过ioctl设置为Context Manager的机制;系统梳理了ServiceManager.addService和getService的全流程,包括Java层通过BinderProxy到native层BpBinder与IPCThreadState的跨进程调用链;解析了oneway与非oneway调用在事务处理与回复机制上的差异;完整展示了app调用bindService时Binder引用的流转过程,涉及Parcel中flat_binder_object的序列化与反序列化;同时归纳了Binder的特性如句柄管理、死亡通知及异常处理机制。文中还明确指出handle由Binder驱动在创建binder_ref时生成,客户端仅作引用。; 适合人群:具备Android系统开发经验,熟悉C++/JNI及操作系统原理,有一定Framework层开发背景的中高级研发人员; 使用场景及目标:①深入理解Android Binder驱动层与应用层的交互机制;②掌握ServiceManager的初始化与服务注册原理;③分析Binder跨进程调用中数据序列化、句柄管理与线程处理流程;④研究oneway调用与普通调用的差异及异常处理机制; 阅读建议:本文聚焦源码级分析,建议结合Android 15_r17源码同步阅读,重点关注IPCThreadState、ProcessState、BpBinder/BnBinder及Parcel的实现细节,理解Binder在内核与用户空间的数据流转过程。
内容概要:本文系统阐述了SDD(规范驱动开发)与Harness(驾驭式流程管理)相结合的AI全栈开发新范式,旨在解决AI编程助手在复杂工程中因上下文丢失、规范不一致导致的“代码能跑、工程难成”问题。SDD将规范作为唯一真实源,通过定义精确的领域语言(如OpenAPI、Gherkin)约束AI生成行为,确保前后端与测试间的一致性;Harness则提供执行引擎,通过上下文隔离、行为禁令、任务原子化与流程锁步等方式,引导AI在已有高质量参照下进行模式复刻,提升生成代码的可用性与PR保留率。二者共同构建从需求到生产的工程化闭环,实现规范可验证、变更可追溯、运维可反馈的“确定性”交付。; 适合人群:具备全栈开发经验、正在探索AI辅助工程落地的研发工程师、技术负责人及AI工程化实践者;尤其适合面临多模块协同、架构一致性维护难题的中高级开发者。; 使用场景及目标:①在AI辅助下高效生成符合统一架构规范的前后端代码与测试用例;②建立可编译、可测试、可持续演进的全栈自动化开发流水线;③实现从需求变更到生产部署的闭环验证与自动回滚机制;④提升AI生成代码在实际项目中的采纳率与系统稳定性。; 阅读建议:此资源强调工程思维转变,建议结合实际项目尝试将架构决策转化为机器可读规范,并搭建Harness流程控制机制,在实践中体会“约束生成”优于“自由创造”的AI协作新模式。
内容概要:本文档聚焦于“独立售电商购售电策略研究”,通过Python编程实现电力市场中独立售电商的购售电优化决策模型。研究内容涵盖在市场化竞争环境下,售电商如何制定最优购电计划、设计售电定价机制,并有效应对电价波动、负荷不确定性及新能源出力随机性等挑战,以实现利润最大化与风险控制的双重目标。文档深入探讨了多时间尺度调度、不确定性建模、市场竞价机制等核心技术,并利用代码进行仿真验证。此外,文档还提供了大量相关科研主题的参考资料,涉及微电网调度、综合能源系统、虚拟电厂、电动汽车、鲁棒优化等多个前沿方向,展现了广阔的技术应用前景和深厚的学术价值。; 适合人群:具备一定电力系统基础知识和Python编程能力,从事电力市场、能源管理、优化调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并复现独立售电商在电力市场中的购售电决策模型;② 掌握基于Python的电力市场仿真与优化方法;③ 借鉴相关代码实现思路,拓展至微电网、虚拟电厂、需求响应等领域的研究与应用; 阅读建议:此资源以实际代码实现为核心,建议读者结合文中提及的相关研究主题进行系统性学习,重点关注模型构建逻辑与算法实现细节,同时可通过提供的网盘链接获取完整代码资源以便调试与二次开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值