我想在MATLAB脚本中使用gnuplot绘制一些数据,而不是使用自定义MATLAB绘图环境。
采用以下示例,这里我生成一些随机数据并将其存储在文本文件中:
% Generate data
x = 0:10;
y = randi(100,size(x));
% Store data in 'xy.txt'
fileID = fopen('xy.txt', 'w');
for i = 1:numel(x)
fprintf(fileID, '%f %f\n', x(i), y(i));
end
fclose(fileID);
现在我使用MATLAB的system
来管道命令到gnuplot:
% Call gnuplot to do the plotting tasks
system('gnuplot &plot ''xt.txt'' &exit &');
但是,我没有正确构造最后一条指令,因为它只打开gnuplot控制台但不执行命令。
此外,我不想在中间步骤中将数据保存在文本文件中,而是选择this direct approach。
我应该如何正确构建system
指令?
注意: Linux上有similar question,我正在运行Windows。
答案 0 :(得分:2)
将所有命令打印到临时文件plot.gp
并将其传递给gnuplot
。
您正在运行Windows,因此将/usr/bin/gnuplot
更改为gnuplot
(可能工作)或gnuplot
可执行文件的完整位置(将 work)
% checked to work under octave 3.6.4 + gnuplot 4.6
x = 0:10;
y = randi(100,size(x));
str="/usr/bin/gnuplot -p plot.gp"
fileID = fopen('xy.txt', 'w');
for i = 1:numel(x)
fprintf(fileID, '%f %f\n', x(i), y(i));
end
fclose(fileID);
f2=fopen('plot.gp', 'w');
fprintf(f2, "plot 'xy.txt' using 1:2");
fclose(f2);
system(str)
使用一个长命令
然而,情节' - ' ...使gnuplot 4.6(Linux)在任何情况下都挂起-p或--persist选项。您可以在Windows中的gnuplot版本上查看它。
x = 0:10;
y = randi(100,size(x));
str="/usr/bin/gnuplot -p -e \"plot \'-\' using 1:2\n";
for i = 1:numel(x)
str=strcat(str,sprintf('%f %f\n',x(i),y(i)));
end
str=strcat(str,"e\"\n");
system(str)
另外,正如@Daniel所说,你对字符串长度有限制,所以使用临时文件然后使用长期命令肯定会更好。
答案 1 :(得分:1)
此答案基于John_West answer,非常有帮助。我已将他的GNU Octave代码翻译成MATLAB语法。
我发现this page有助于理解GNU Octave和MATLAB在代码语法方面的差异。 this page有助于理解GNU Octave字符串上的转义序列(实际上与C中的相同)。
这些是我所做的转换:
"
字符串分隔符替换为'
\"
转义序列替换为"
\'
转义序列替换为''
此外,我进行了以下转换:
sprintf
。strcat
会删除尾随的ASCII空白字符。 (您可以在the documentation和this answer)中了解相关信息。这种方法非常有效。
% checked to work under Matlab R2015a + gnuplot 5.0 patchlevel 1
x = 0:10;
y = randi(100,size(x));
str = 'gnuplot -p plot.gp';
fileID = fopen('xy.txt', 'w');
for i = 1:numel(x)
fprintf(fileID, '%f %f\n', x(i), y(i));
end
fclose(fileID);
f2 = fopen('plot.gp', 'w');
fprintf(f2, 'plot ''xy.txt'' using 1:2');
fclose(f2);
system(str)
此脚本将打开带有绘图的gnuplot窗口。在关闭绘图窗口之前,MATLAB不会恢复脚本的执行。如果您想要连续的执行流程,您可以使用以下命令自动保存绘图(例如,作为.png,以及其他格式):
fprintf(f2,'set terminal png; set output "figure.png"; plot ''xy.txt'' using 1:2');
这种方法正在探索中。尚未取得成功的结果(至少John_West和我没有得到任何情节)。我正在包含我的MATLAB代码,因为我从John_West回答了它:
x = 0:10;
y = randi(100,size(x));
str = sprintf('gnuplot -p -e "plot ''-'' using 1:2');
for i = 1:numel(x)
str = strcat(str, sprintf('\n%f %f', x(i), y(i)));
end
str = strcat(str, sprintf('\ne"'), sprintf('\n'));
system(str)
此代码不会自行终止,因此您需要通过在MATLAB命令行中输入命令e
来手动恢复执行。