使用Matlab / Octave进行字符模式(shell)绘图?

8
这也许是一个有些奇怪的问题,但无论如何。有时候我需要通过SSH登录到各地(大洲)的服务器或实验室计算机以检查东西,甚至运行Matlab或Octave查看最新数据等等。然后,当我需要任何类型的图形时,问题就来了。要么我将可能是垃圾的大块内容复制到我的计算机上,并在本地生成图形。要么,如果前一种尝试不可取,我会通过ssh和X-转发运行Matlab,这只会给低带宽和/或高延迟带来痛苦。
实际上,我想知道是否有一种方法可以在shell中生成老式的1980年代风格的字符模式图形,至少是简单的线条或点之类的东西(而不需要X-转发)。拥有一个“丑陋”(但酷?)的字符模式绘图至少能使我确定我是否正在观察例如一条直线、一个抛物线或者只是纯粹的垃圾——这可能非常有帮助。我知道,有些东西可以通过巧妙的数学方法来确定,但是抽象思考被高估了。

抽象思维被高估了……好吧,我们不要去那里 :) - Rody Oldenhuis
3个回答

8
在Octave中,您不应该有任何问题。我通常通过ssh在远程机器上进行计算,并且经常使用它。
只要您将gnuplot作为图形工具包(供将来参考,截至3.6.2这仍然是默认设置,但可能会更改为fltk),如果没有X显示,则会得到ASCII图。
要确保您拥有正确的图形工具包,请在提示符下键入graphics_toolkit。要将其更改为gnuplot,请使用graphics_toolkit gnuplot

这种解决方案还算可以。虽然我以前见过更好的ASCII艺术,但它能够胜任工作。不过,gnuplot中关于这个功能的文档并不是很多。例如,彩色线条会非常棒。 - s-m-e
@ernestopheles,当您搜索此功能时,知道终端类型名称为“dumb”可能会很有用。彩色行实际上非常酷,也许您可以向他们提交一个补丁程序。我认为目前它只能做不同的字符。 - carandraug
是的,我了解“dumb”。需要一些时间才能在gnuplot pdf文档中找到它。嗯,它说,“dumb”存在-就是这样。 - s-m-e
这在 版本5.1.0 中还可用吗?我无法让它工作。您的 $TERM 设置和 graphics_toolkit() 是什么?其他哪些设置是相关的? - not2qubit

3

plot命令(以及相关命令)使用Java图形库,显然在纯文本模式下无法工作。据我所知,没有办法绕过这些底层库调用并将任何图形输出重定向到一些ASCII艺术翻译器/生成器。

您可以尝试类似于此处建议的内容:

h = figure('visible', 'off');
plot(h, ...)            
saveas(gcf, 'file.fig') 

然后,使用scp/rsyncfile.fig文件传输过来(这有点像X-forwarding...)。

当然,你也可以编写一个生成绘图的函数,将其存储到临时文件中(如上所示),然后通过ASCII艺术生成器 (或者这个)将PNG/JPG/...转换为文本格式,并显示在终端中。


是的,这是一个不错的解决方案,但我最终还是需要再次复制一些东西。我更想知道是否可以“停留”在shell中而不需要复制文件。 - s-m-e
Java...是的,在问题1853259中,他们仍然使用x-forwarding,但没有实际转发完整的界面。 - s-m-e
@ernestopheles:看一下我的编辑。不过这需要一点工作,而且我也不确定质量如何。不过这是个好主意,等我有时间了再想想怎么做 :) - Rody Oldenhuis

3

虽然对于这个问题有许多部分的答案,但在 Windows 上通过 WSL & Cygwin 对我有效的唯一方法如下。

  1. 作为交互式 CLI 会话:

# Start the Octave CLI session:
octave-cli.exe -iWq

graphics_toolkit ("gnuplot")
x = -2*pi:2*pi;
y = sin(x);
figure(1,'Visible','off');
plot(y)
print (1, "-ddumb", "dummy"); type -q dummy.txt

生成中:

    1 |-------------------------------------------------------------|
      |        + ***    +        +       +  ** *  +        +        |
      |        **   *                     **   *                    |
      |       *     *                    *      *                   |
      |       *      *                   *       *                  |
  0.5 |-+    *        *                 *        *                +-|
      |      *        *                 *         *                 |
      |     *          *               *           *                |
      |    *           *               *           *                |
      |    *            *              *            *               |
    0 |-+ *             *             *             *             +-|
      |                  *            *              *              |
      |                  *           *               *              |
      |                   *          *                *             |
      |                   *         *                 *             |
 -0.5 |-+                  *        *                  *        * +-|
      |                    *       *                    *      *    |
      |                     *      *                     *    *     |
      |                     ****  *                      *   *      |
      |        +        +       *+*      +        +       *+*       |
   -1 |-------------------------------------------------------------|
      0        2        4        6       8       10       12       14

不幸的是,这仍然依赖使用临时文件dummy.txt。 但可怕糟糕的Octave文档没有提供任何明显的替代方案,也没有示例。在一篇难以理解的文档阅读结束时,通过以下相关问题进行猜测和解释可能更为有效:


  1. 作为脚本化的CLI会话:

$ cat foo.m
#!/usr/bin/env octave

graphics_toolkit ("gnuplot")
setenv GNUTERM dumb
x = -2*pi:2*pi;
y = sin(x);
plot(y)
pause (2);

然后用以下命令运行:octave-cli foo.m

  1. 作为一行代码:

octave-cli.exe --eval "graphics_toolkit gnuplot;setenv GNUTERM dumb; plot(sin(-2*pi:2*pi)); pause(2)"

注意:必须使用 pause 命令才能输出结果!


如果你正在使用 gnuplot 并寻找其他命令替代 print 命令,请执行以下操作:

gnuplot -e "set term"
gnuplot -e "set terminal dumb; plot sin(x);"

例如,在得到适当支持的 ANSI xterms 中,您可以使用 sixel 来进行以下操作:
gnuplot -e "set terminal sixelgd; plot sin(x);"

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接