MATLAB读取Argo数据【5】--Argo数据的提取和画图分析(2)(双x轴作图)

哈喽!大家好,这里是小Yang
前面部分的文章向大家分享了如何Argo数据的获取和如何读取Argo基本信息和Argo数据,那么这篇文章小Yang将向大家详细说明如何利用Argo的数据进行画图分析!

过程中有不明白的小伙伴可以看专栏的前几篇文章回顾一下哦!

作图代码

话不多说,先上代码!

%% 数据读取部分
clc;clear;
dat=importdata("2901128_061.dat");
data=dat.data;
Corrected_Pressure=data(:,2);
Corrected_Temp=data(:,5);
Corrected_Salinity=data(:,8);
Y=Corrected_Pressure;
X1=Corrected_Temp;
X2=Corrected_Salinity;
[~,date,Lon,Lat]=read_time_coord_from_dat("2901128_061.dat");
date=cellstr(char([date{:}]));

%% 作图部分
% 绘制第一个图层
figure(1)
plot(fliplr(X1),Y,'LineWidth',2);
hold on
position=[0.2 0.1 0.5 0.8];
set(gca,'xaxislocation','top','yaxislocation','left','position',position);
set(gca,'XTick',0:4:32)
set(gca,'YDir','reverse');
xl=xlabel('Corrected Temperature(℃)');
yl=ylabel('Corrected Pressure(dbar)');
% 绘制第二个图层
axes;
plot(fliplr(X1),Y,'LineWidth',2);
hold on;
plot(fliplr(X2),Y,'LineWidth',2);
xl1=xlabel('Corrected Salinity(PSU)');
set(gca,'xaxislocation','bottom','yaxislocation','right','position',position);
set(gca,'YDir','reverse');
set(gca,'yticklabel',[]);

%% 设置图像参数和打印图像
h=legend('Temperature','Salinity','fontsize',6,'location','northwest');
location=strcat(Lon,'°E',',',Lat,'°N');
yt=ylabel({location{:};date{:};'的Argo温盐数据'},'Color','r','FontSize',12,'position',[52,500]);
set(yt,'rotation',0)
set([xl,yl,xl1],'FontSize',8,'FontWeight','Bold')
saveas(1,'test','jpg')

做出的图像如下:请添加图片描述
有不懂没关系,可以继续往下看,小Yang会向大家详细讲解!

数据读取部分代码的解析

首先,就是在小Yang专栏第四篇文章的Argo数据读取部分啦,这里小Yang就不多解释,不清楚的小伙伴可以去看一看噢。总之我们可以读取到Argo所记录的 不同深度对应修正后水压、修正后温度和修正后盐度 这三个参数。

%% 数据读取部分
clc;clear;
dat=importdata("2901128_061.dat");
data=dat.data;
Corrected_Pressure=data(:,2);
Corrected_Temp=data(:,5);
Corrected_Salinity=data(:,8);
Y=Corrected_Pressure;
X1=Corrected_Temp;
X2=Corrected_Salinity;

然后,虽然我们读取了Argo记录的数据部分,但是记录数据的相关信息(坐标、时间)我们也需要说明清楚,因此,小Yang用了自己编写的read_time_coord_from_dat函数来读取这些信息 (这个函数的源码及其说明已经在小Yang这个专栏的第二篇文章说清楚啦)。

[~,date,Lon,Lat]=read_time_coord_from_dat("2901128_061.dat");

datetime格式的日期时间数据转变为字符串格式,以便于在图像中同其它字符信息共同呈现出来。

date=cellstr(char([date{:}]));

至此,Argo数据和基本信息的读取就结束了,那么下一步就是作图啦

双X轴图像的绘制

双X轴作图的原理

在MATLAB,我们有直接做双Y轴的简易方法,即通过yyaxis rightoryyaxis left来设定左右Y轴,进而得到两个Y轴的图像。不过,这种成像方法是在一个图层进行的,而双X轴的制作在MATLAB没有直接可利用的代码,那么它的制作原理其实就是图层的叠加

给大家举个例子!
做一个y=2x+1的图像,这个很简单

figure(1)
x=1:10;
y1=2*x+1;
plot(x,y)
position=[0.2 0.1 0.5 0.8];
set(gca,'position',position);
hold on

其中,position参数的设置就是调整坐标系在图窗之中的位置和长宽,position设置的参数从左到右一次为:坐标系所在的图窗水平方向上位置、坐标系所在图窗垂直方向上的位置、坐标系水平方向的长度、坐标系垂直方向上的长度,这些参数的设置按照自己的审美来就好啦。可以得到图像:
在这里插入图片描述
这就是一个图层时的图像,这时候我们添加一部分代码:

figure(1)
x=1:10;
y=2*x+1;
plot(x,y)
position=[0.2 0.1 0.5 0.8];
set(gca,'position',position);
hold on

axes
plot(x,y)
position2=[0.3 0.1 0.5 0.8];
set(gca,'position',position2);
hold on

其中,axes是在原来的图窗上新建一个坐标系,后面的内容都在这个新建的坐标系上进行。在这个新的坐标系中,我们画了一个新的y=2x+1的图像,并改变了一下这个坐标系的水平位置(0.2变成0.3), 然后我们可以得到新的图像:
在这里插入图片描述
可以发现后一个坐标系会覆盖前一个坐标系,但是其X轴的数字并不会因此变成后一个坐标系的,而是直接交错在一起,说明如果我们把后一个坐标系的X轴刻度去掉,那么剩下的就是第一个坐标系的刻度(当然Y轴也是这样)。

到这里,相信有不少朋友知道双X轴图像的做法了。
其实通过两个坐标系来做双X轴图像,就是想利用第一个坐标系的X轴罢了,第二个坐标系只需要把X轴放到上面,然后再和第一个坐标系重合,那么就可以得到我们想要的双X轴图像了!

把X轴放在坐标系上方也很简单,只需要在set中加上'xaxislocation','top'就可以啦

figure(1)
x=1:10;
y=2*x;
plot(x,y)
position=[0.2 0.1 0.5 0.8];
set(gca,'xaxislocation','top','position',position);
hold on

axes
plot(x,y)
set(gca,'position',position);
hold on

需要留意一下,这里第二个坐标系的position是和第一个一样的,目的就是让两个坐标系大小相同,位置重合,形成下图两个X轴的效果!

在这里插入图片描述

作图部分代码的解析

在大家了解了双X轴的作图原理后,我们作图部分的代码就很容易理解了!

首先,绘制第一个坐标系,绘制的时候我们需要注意一个地方:作为海洋学子,作图一般都是从地面向下往海底作图,不仅Y轴要向下,我们的数据也要反转一下。fliplr来镜面反转数据:plot(fliplr(X1),Y,'LineWidth',2);。并在set处设置YDirreverse来反转Y轴指向。

设定好这个坐标系的位置、X轴的位置、Y轴的位置,小Yang在这里是将第一个坐标系的X轴设在顶部,Y轴设在左边set(gca,'xaxislocation','top','yaxislocation','left','position',position);
再加上横纵轴的标题,那么第一个坐标系就绘制好啦。

第二个坐标系的做法也和第一个差不多,但是不需要设置X轴的位置,因为我们第一个坐标系的X轴已经设置在上面了,**不过同样的,我们要用fliplr反转一下数据,同时反转一下Y轴,然后set处设置位置与第一个坐标系相同。

第二个坐标系的Y轴刻度要去掉,避免与第一个图层的刻度处发生重叠:**set(gca,'yticklabel',[]);

%% 作图部分
% 绘制第一个图层
figure(1)
plot(fliplr(X1),Y,'LineWidth',2);
hold on
position=[0.2 0.1 0.5 0.8];
set(gca,'xaxislocation','top','yaxislocation','left','position',position);
set(gca,'XTick',0:4:32)
set(gca,'YDir','reverse');
xl=xlabel('Corrected Temperature(℃)');
yl=ylabel('Corrected Pressure(dbar)');
% 绘制第二个图层
axes;
plot(fliplr(X1),Y,'LineWidth',2);
hold on;
plot(fliplr(X2),Y,'LineWidth',2);
xl1=xlabel('Corrected Salinity(PSU)');
set(gca,'xaxislocation','bottom','yaxislocation','right','position',position);
set(gca,'YDir','reverse');
set(gca,'yticklabel',[]);

这样就完成了绘图的主体部分啦。

其它参数的设置和打印图像

这里就是基本的图像操作啦,添加图例legend就不多说,小Yang在这里顺便补充一下图片红色标题的做法:

图中的标题并不是用title做的,而是ylabel,即作为一个Y轴的标题。ylabel可以换行输出需要的文字部分,用分号来隔开就可以了,需要注意的是,文字部分要字符形式的,如果遇到需要表达的变量,可以先提前用strcat拼接成字符串,再输出(当然不仅这种方法)。

另外一个值得一提的点,就是
yt=ylabel({location{:};date{:};'的Argo温盐数据'},'Color','r','FontSize',12,'position',[52,500]);中,'position'的意义和坐标系一样,但是表达形式不同,[52,500]中左部分指的是文字部分在水平方向的位置,右部分即是垂直方向,这里的52500是相对于已经建立好的坐标系的刻度而言的,在我们这幅图中,y=500是接近中间偏上的位置,因此设定为500(这里要理解呀!详细可以在官网上面查一下哦)。

set(yt,'rotation',0)的作用就是让文字水平写出,而不是向像一般的Y轴标题“要横着头来看”。

%% 设置图像参数和打印图像
h=legend('Temperature','Salinity','fontsize',6,'location','northwest');
location=strcat(Lon,'°E',',',Lat,'°N');
yt=ylabel({location{:};date{:};'的Argo温盐数据'},'Color','r','FontSize',12,'position',[52,500]);
set(yt,'rotation',0)
set([xl,yl,xl1],'FontSize',8,'FontWeight','Bold')
saveas(1,'test','jpg')

设定完字符、标题、曲线的格式后,就可以用saveas输出图像啦!

请添加图片描述

这就是本专栏的最后一部分内容!
如果觉得分享的内容对你有带来帮助,就点个赞鼓励一下萌新博主吧!
这里是小Yang,一名爱分享的海洋学子,喜欢就关注一下啦 ~

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值