引言
碎碎念:闲来无事,想要锻炼自己的绘图能力,正好看到有篇论文的图还蛮特别的,主要是涉及不同要素在地图上的运动路径,可用 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。
数据
台风数据
| YEAR | MONTH | DAY | TIME | LAT | LON | WIND |
| 2011 | 8 | 22 | 12 | 14.7111 | 127.622 | 25 |
| 2011 | 8 | 22 | 18 | 15.1636 | 127.545 | 30 |
| …… | …… | …… | …… | …… | …… | …… |
| 2011 | 8 | 30 | 12 | 24.4533 | 119.073 | 40 |
| 2011 | 8 | 30 | 18 | 24.5538 | 118.938 | 35 |
Argo数据
| LON | LAT |
| 120.3208 | 19.9109 |
| …… | …… |
| 120.4751 | 19.92852 |
断面数据
| LON | LAT |
| 120.0159 | 21.41596 |
| …… | …… |
| 120.0159 | 20.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也可以调整位置及大小。


被折叠的 条评论
为什么被折叠?



