有时候(比如写毕业大论文时),我们需要将几张图拿出来,合并成一张图。
但这些图可能是几年以前画的图片,怎么也找不到原始数据和程序了,只剩下一些Matlab的fig文件。
如何从这些fig文件中重新找回原始数据?
这时候,有个脑袋瓜转得快的童鞋举手了:我们可以用这些fig文件,画出jpg或者tif格式的曲线图,然后用这条推文[定制高级版:如何从别人论文里的曲线图中,获取数据点和线的值?]里的方法,不就可以了么?
童鞋你真聪明,下课后到这里来报到,给你平时成绩加10分。
但是,在这个问题上,如果使用上面那种方法至少有两个局限性:
(1) 当曲线上点的密集程度大到一定程度时,尤其是曲线的数量还不止一条时,采用鼠标手动取点会非常辛苦,如下图:
(2) 如果不是曲线图,而是等高线图,上面那种方法无能为力,如下图:
下面是几种从fig文件中重新找回原始数据方法,你值得拥有:
1. 单条曲线图
如果图像是类似于上面这样的单条曲线,可以通过下面方式输出横坐标,纵坐标的取值。
open('figname.fig'); h_line=get(gca,'Children'); xdata=get(h_line,'Xdata'); ydata=get(h_line,'Ydata');
2. 多条曲线图
如果图像是类似于上面这样的多曲线,可以通过下面方式输出横坐标,纵坐标的取值。
open('figname.fig'); lh = findall(gca, 'type', 'line');% 如果图中有多条曲线,lh为一个数组 xc = get(lh, 'xdata'); % 取出x轴数据,xc是一个元胞数组 yc = get(lh, 'ydata'); % 取出y轴数据,yc是一个元胞数组
%如果想取得第2条曲线的x,y坐标 x2=xc{2}; y2=yc{2};
3. 空间曲线
如果图像是类似于上面这样的空间曲线,可以通过下面方式输出x,y,z 坐标的取值。
open('figname.fig'); h_line=get(gca,'Children');%get line handles xdata=get(h_line,'Xdata'); ydata=get(h_line,'Ydata'); zdata=get(h_line,'Zdata');
4. 场图
如果图像是类似于上面这样的场图,即图像的每个像素都有数据,可以通过下面方式获得图像每个点的值。
输出data是矩阵,大小是图像像素的行列数。
open('figname.fig'); h=get(gca,'Children'); data=get(h,'Cdata');
不过,这些补救办法终究只是补救。最好的办法,还是在平时要养成备份的习惯:及时备份、多重备份!
转载自:3M君
|