从Matlab的Fig图片中提取数据,并保存成csv文件
本人亲自实测有效,但能力有限,目前仅用代码测试了
Figure图片单线条和双线条
的提取(多线条可模仿双线条代码)。很多帖子的代码不是不全就是仅限于单线条提取的,自己摸索了两天才弄出来。
提取数据目的
:通过从Matlab中的Figure图片提取数据,再利用python进行重新绘制,使得科研论文图片效果更佳。
1.Fig图像是由单条曲线绘制
前提
:要从Matlab中的Fig图片提取数据,首先会用Matlab中画出Fig图片,然后保存成
fig文件
,记得文件格式后缀是”.fig”。
正文
:
- Matlab中的Fig图像曲线在工作空间是以矩阵形式保存的,在工作区可以查看,这里不细讲。
-
将曲线数据提取,也就是将x和y轴的数据分成两列保存到表格中,可以保存为
excel
和
csv
格式,这里保存为csv是本人工作需要。 - 单条曲线的提取还是比较简单,本人将代码详细贴出来,请参考:
%%将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图像是由双条曲线绘制
正文
:请配合本人代码食用效果更佳
-
在上面有说到,Fig数据在Matlab中以数组形式存放,
一条曲线的数据存放在一个方格
,对于双线条而言,在Matlab的工作区里有两格存放,也就是有两个m*n的矩阵。 - handle就是数据的句柄,也就是指向,handle(1)指向第一个方格的矩阵,handle(2)指向第二个方格的矩阵。
- 关于双曲线的表格首行称呼问题,这也是其他帖子没有说到的问题,两条曲线也就代表着表格里有四列数据,如何使每条曲线的x和y按列导出到csv或excel呢?关键是data_cell_1和data_cell_2分割功能,然后用title_1和title_2表示称呼,再使用result_1和result_2将每条曲线x和y数据写成一个类似的二维数组(每列数据首行是”称呼”),最后保存的时候记得保存,只需将每条曲线的数据保存到统一文件下就行。
- ‘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 版权协议,转载请附上原文出处链接和本声明。