昨天文章发出去才发现少了部分代码遗漏了,今天补上 经常有读者咨询fig文件里面的x和y轴的数据如何提取,故分享总结一下这个基础方法,在一些场景下面,对方不会把源代码提供,只会提供一个figure来做交互和结果查看,这时候如果想重新绘制figure增加内容,就需要提取figure图的数据,
1、保存一个figure文件
clear
clc
close all
x = 0:0.1:10;
y = sin(x);
figure
plot(x,y)
saveas(gcf,'y.fig');
fig文件作为Matlab中的图形文件,其实原始数据是会存储在figure对象中的,那么通过get函数获取figure对象中相应的数据属性,就可以得到fig图形中的数据。
2、提取figure数据的步骤
提取fig文件数据的方法为:
open("y.fig")
hl = get(gca,'Children'); % 获取坐标轴的子对象:Line对象
ha = get(gcf,'Children'); % 获取当前的图形的子对象:Axes坐标轴对象
第三步:获取line对象的xdata、yadata属性;
xdata = get(hl,'XData');
ydata = get(hl,'YData');
结果:
可以看出绘制曲线的原始数据保存在line对象中,而line对象是axes的子对象,axes是figure的子对象。获取fig文件原始数据的思路是:先找出figure对象的所有axes子对象,再找出每个坐标轴的所有line子对象,最后获取每条line的XData、YData、ZData属性,得到原始数据。
这个时候数据就在xdata和ydata,可以进行二次绘图。
3、针对特殊情况的处理
3.1 subplot的figure
x = 0:0.1:10;
y = sin(x);
y2 = cos(x)
figure
subplot(211)
plot(x,y)
subplot(212)
plot(x,y2)
saveas(gcf,'yy2.fig');
clear
clc
close all
open("yy2.fig")
figure_info=findall(gcf,'type','line');
xc1=get(figure_info(1,:),'xdata');
yc1=get(figure_info(1,:),'ydata');
xc2=get(figure_info(2,:),'xdata');
yc2=get(figure_info(2,:),'ydata') ;
subplot的就需要做遍历,同时做好数据的对应,对应哪个subplot
3.2 三维图
%%
clear
clc
close all
x = 0:0.1:10;
y = sin(x);
y2 = cos(x)
figure
plot3(x,y,y2)
saveas(gcf,'xyy2.fig');
open("xyy2.fig")
% h = figure
hl = get(gca,'Children') % 获取坐标轴的子对象:Line对象
ha = get(gcf,'Children'); % 获取当前的图形的子对象:Axes坐标轴对象
xdata = get(hl,'XData');
ydata = get(hl,'YData');
zdata = get(hl,'ZData');
figure
plot3(xdata,ydata,zdata)