从Matlab的Fig图片中提取数据,并保存成csv文件

  • Post author:
  • Post category:其他


从Matlab的Fig图片中提取数据,并保存成csv文件

本人亲自实测有效,但能力有限,目前仅用代码测试了

Figure图片单线条和双线条

的提取(多线条可模仿双线条代码)。很多帖子的代码不是不全就是仅限于单线条提取的,自己摸索了两天才弄出来。

提取数据目的

:通过从Matlab中的Figure图片提取数据,再利用python进行重新绘制,使得科研论文图片效果更佳。



1.Fig图像是由单条曲线绘制


前提

:要从Matlab中的Fig图片提取数据,首先会用Matlab中画出Fig图片,然后保存成

fig文件

,记得文件格式后缀是”.fig”。


正文

  1. Matlab中的Fig图像曲线在工作空间是以矩阵形式保存的,在工作区可以查看,这里不细讲。
  2. 将曲线数据提取,也就是将x和y轴的数据分成两列保存到表格中,可以保存为

    excel



    csv

    格式,这里保存为csv是本人工作需要。
  3. 单条曲线的提取还是比较简单,本人将代码详细贴出来,请参考:
%%将matlab的fig文件提取到csv或者excel中,且保留行列格式
%%单曲线单坐标情况

%1
open('图片.fig')%打开fig格式图片
handle = findobj(gca,'Type','line');%获取曲线的handle,如果图中有多条曲线,handle为一个数组
xdata = get(handle,'XData');%将handle的x数据赋给xdata一维数组
ydata = get(handle,'YData');%将handle的y数据赋给ydata一维数组
data = [xdata',ydata'];  % 将数据组集到data,将x和y数据写进一个二维数组
[m, n] = size(data);    %得到数据的数据长度        
data_cell = mat2cell(data, ones(m,1), ones(n,1));  % 将data切割成m*n的cell矩阵
title = {'x列数据的称呼''y列数据的称呼'};     % 添加变量名称,csv首行的每一列的名称,单曲线只有x和y名称
result = [title; data_cell];           % 将变量名称和数值组集到result
s = xlswrite('图片.csv', result);     %保存为csv格式文件,名字为“图片”
  



2.Fig图像是由双条曲线绘制


正文

:请配合本人代码食用效果更佳

  1. 在上面有说到,Fig数据在Matlab中以数组形式存放,

    一条曲线的数据存放在一个方格

    ,对于双线条而言,在Matlab的工作区里有两格存放,也就是有两个m*n的矩阵。
  2. handle就是数据的句柄,也就是指向,handle(1)指向第一个方格的矩阵,handle(2)指向第二个方格的矩阵。
  3. 关于双曲线的表格首行称呼问题,这也是其他帖子没有说到的问题,两条曲线也就代表着表格里有四列数据,如何使每条曲线的x和y按列导出到csv或excel呢?关键是data_cell_1和data_cell_2分割功能,然后用title_1和title_2表示称呼,再使用result_1和result_2将每条曲线x和y数据写成一个类似的二维数组(每列数据首行是”称呼”),最后保存的时候记得保存,只需将每条曲线的数据保存到统一文件下就行。
  4. ‘C1:D5’的意思是表格的C列第一格,D列的第五格,这是因为我的第二条曲线是散点图,只有四个点,加上称呼,所以长度是两列五行。
%%将matlab的fig文件提取到csv或者excel中,且保留行列格式
%%双曲线单坐标情况

open('图片1.fig')
handle = findobj(gca,'Type','line');%获取曲线的handle,如果图中有多条曲线,handle为一个数组
xdata1 = get(handle(1),'XData');%handle是1*2数组,handle(1)是第一个位置,存储一个矩阵
ydata1 = get(handle(1),'YData');
xdata2 = get(handle(2),'XData');%handle是1*2数组,handle(2)是第二个位置,存储一个矩阵
ydata2 = get(handle(2),'YData');
data1 = [xdata1',ydata1'];  % 将数据组集到data1
data2 = [xdata2',ydata2'];  % 将数据组集到data2
[m, n] = size(data1);            
data_cell_1 = mat2cell(data1, ones(m,1), ones(n,1));  % 将data1切割成m*n的cell矩阵
[m, n] = size(data2);            
data_cell_2 = mat2cell(data2, ones(m,1), ones(n,1));  % 将data2切割成m*n的cell矩阵
title_1 = {'x1列数据的称呼''y1列数据的称呼'};     % 添加变量名称
title_2 = {'x2列数据的称呼''y2列数据的称呼'};     % 添加变量名称
result_1 = [title_1; data_cell_1];    % 将变量名称和数值组集到result
result_2 = [title_2; data_cell_2];    % 将变量名称和;数值组集到result

s = xlswrite('图片1.csv', result_1); %将 result_1写到表格前两列
s = xlswrite('图片1.csv', result_2,'C1:D5');%将 result_2写到表格后两列
  



3.小结

上述如有不当之处,请大家提出指正,欢迎交流。


如需转载,请标明出处,谢谢各位!



版权声明:本文为dgut13432976621原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。