如何从MATLAB管道命令到gnuplot

时间:2016-02-18 23:35:06

标签: matlab gnuplot

我想在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。

2 个答案:

答案 0 :(得分:2)

使用带有gnuplot

命令的临时脚本

将所有命令打印到临时文件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 documentationthis answer)中了解相关信息。

使用带有gnuplot

命令的临时脚本

这种方法非常有效。

% 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在comment中解释的那样。

使用一个长命令

这种方法正在探索中。尚未取得成功的结果(至少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来手动恢复执行。