【问题标题】:Directly use gnuplot from octave?直接使用八度的gnuplot?
【发布时间】:2020-10-08 16:23:23
【问题描述】:

我通常认为 Octave 是最易于使用的数据评估工具,但对于数据可视化来说却很麻烦。

另一方面,我发现 Gnuplot 是最易于使用的数据可视化工具,因为

  • 它非常专注,
  • 其强大的演示示例库,以及
  • 其全面的交互式帮助功能。

在 gnuplot 和用户之间放置任何语言包装器会破坏这些优势,但纯 gnuplot(故意)缺乏进行任何重要预处理(例如数值微积分)的能力。

Octave 可以使用 gnuplot 作为后端,但为了保持优势,我更喜欢直接使用 gnuplot 命令,比如:

dx = 0.1;
x = 0:dx:2*pi;
y = sin(x);
y2 = cumsum(y)*dx;
outputFileName = "sin.pdf"

# Contains mockup syntax:
gp set term pdfcairo size 30cm,20cm noenhanced
gp set output '${outputFileName}'
gp plot ${x,y} using 1:2 with lines title "The sin(x) function",         \
gp      ${x,y2} using 1:2 with lines title "Integrated sin(x) function", \
gp      cos(x) title "The cos(x) function"
gprun

编写这个“gp”实用程序的基本实现很容易,尽管变量插值必须以显式gp(["set output '" outputFileName "'"]) 替换,但会降低可读性。然而,${x,y} 表文件的创建并不容易。

是否有任何直接的方式来获得类似的功能?


具有讽刺意味的是,一些 很多 旧版本的 octave(直到 2005 年、2006 年左右)具有此功能(gsetgraw、...)但将它们降级为内部实现细节。在一些较早的讨论中,我发现参考例如__graw__,也不再存在,一些过时的文档网站提到了gplot,它仍然存在,但用途完全不同。

【问题讨论】:

  • 你不能写入文件 gnuplot 脚本并通过系统命令运行它吗?
  • @TasosPapastylianou 是的,但是我有两个脚本,仍然需要手动为该脚本创建数据文件。

标签: gnuplot octave


【解决方案1】:

老实说,我认为你想多了。创建一个临时脚本并运行它通常比繁琐的库更直接和可移植(例如,请参阅我之前的类似答案 here 以获取 sqlite 示例)

使用下面的方法对我来说效果很好,在我看来可读性很强,并且不会产生不必要的文件(至少在您的工作区中不可见)。

dx = 0.1;
x  = 0 : dx : 2 * pi;
y  = sin( x );
y2 = cumsum( y ) * dx;

outputFileName = "sin.pdf"

% Create Gnuplot Script 
GPScriptName = tempname();   gp = fopen( GPScriptName, 'w');

fdisp( gp, 'set term pdfcairo size 30cm,20cm noenhanced'                         );
fdisp( gp, sprintf( 'set output "%s"', outputFileName )                          );
fdisp( gp, 'plot "-" using 1:2 with lines title "The sin(x) function", \'        );
fdisp( gp, '     "-" using 1:2 with lines title "Integrated sin(x) function", \' );
fdisp( gp, '     cos(x)                   title "The cos(x) function"'           );
fdisp( gp, [ x(:), y(:)  ]                                                       );
fdisp( gp, 'e'                                                                   );
fdisp( gp, [ x(:), y2(:) ]                                                       );
fdisp( gp, 'e'                                                                   );
fdisp( gp, ';'                                                                   );

fclose( gp )

% Run script with Gnuplot
Cmd = sprintf( 'gnuplot --persist "%s"',  GPScriptName );
[Status, Output] = system( Cmd );

我在这里使用了“内联”数据,这样我就可以将其直接转储到脚本中(如建议的here),但如果您愿意,您可以使用相同的逻辑将fdisp 用于单独的临时数据文件,并从中读取您的 Gnuplot 脚本;如果您担心会产生大量临时文件并占用空间...没关系。

我认为这种方法很好,并且可以为您提供更多控制...但是,如果您坚持,将那些 fdisp 调用包装到 gp 函数中,并将 system 调用包装到 @ 中应该是微不足道的987654328@函数...

【讨论】:

  • fdisp的使用帮助很大;我不知道存在这种生成 gnuplot 兼容数据的直接方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2011-12-16
相关资源
最近更新 更多