【问题标题】:Character-mode (shell) plots with Matlab / Octave?使用 Matlab / Octave 绘制字符模式(shell)图?
【发布时间】:2012-11-24 14:55:42
【问题描述】:

这可能是一个有点奇怪的问题,但无论如何。有时,我在整个地方(大陆)的服务器或实验室计算机中使用 ssh 以检查内容,有时甚至运行 Matlab 或 Octave 以查看最新数据等。然后,当我需要任何类型的绘图时,乐趣开始。要么我通过互联网将一大块可能的垃圾复制到我的电脑上,然后在本地生成情节。或者,如果之前的尝试没有选择,我通过 ssh 和 X-forwarding 运行 Matlab,考虑到低带宽和/或高 ping,这只是痛苦的。

实际上,我想知道是否有一种方法可以在 shell 中生成类似 1980 年代的老式字符模式图,至少是带有线条或点的简单东西(没有 X 转发)。拥有一个“丑陋”(但很酷?)的角色模式情节至少可以让我确定我是否在看,例如一条线、一条抛物线或只是简单的废话——这非常有用。我知道,有些东西可以通过聪明的数学来确定,但是,嘿,抽象思维被高估了。

编辑...另一个相关的 (?) 标签。

【问题讨论】:

  • “抽象思维被高估了”......好吧,我们不要去那里:)

标签: matlab shell plot octave ascii-art


【解决方案1】:

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

  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 documentation 没有提供任何明显的替代方案,也没有提供示例。在阅读难以理解的文档时,最好通过以下相关问题来解释和猜测:


  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 时),请执行以下操作:

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

例如,在适当支持的 ANSI xterms 中,您可以将 sixel 用于:

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

【讨论】:

    【解决方案2】:

    在 Octave 的情况下,您应该没有问题。我通常通过 ssh 在远程机器上进行计算,并且一直使用它。

    只要您将 gnuplot 作为您的图形工具包(供将来参考,从 3.6.2 开始,这仍然是默认设置,但将来可能会更改为 fltk),如果没有 X 显示,您将获得 ASCII 绘图。

    为确保您拥有正确的图形工具包,只需在提示符处输入graphics_toolkit。要将其更改为 gnuplot,请使用 graphics_toolkit gnuplot

    【讨论】:

    • 这样就解决了。它不漂亮,我以前见过更好的 ASCII-art,但确实可以。虽然,在 gnuplot 中并没有太多关于此功能的文档。例如。彩色线条会很棒。
    • @ernestopheles 在搜索此功能时知道它可能很有用,终端类型名称为“dumb”。彩色线条实际上会很酷,也许您可​​以向它们提交补丁。我认为目前,它只适用于不同的角色。
    • 是的,我发现了“哑巴”。需要一段时间才能在一些 gnuplot pdf 文档中找到它。好吧,它说,存在“愚蠢”——就是这样。
    • 这在version 5.1.0 中仍然可用吗?我不能让它工作。你的$TERM 设置和graphics_toolkit() 是什么?还有哪些相关设置?
    【解决方案3】:

    plot 命令(和朋友)使用 Java 图形库,这在纯文本模式下显然不起作用。 AFAIK,没有办法绕过这些底层库调用并将任何图形输出重定向到一些 ASCII 艺术翻译器/生成器。

    您可能想尝试类似于建议的here

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

    然后scp/rsync file.fig 结束(这有点像 X 转发真的......)。

    您当然可以编写一个函数来生成绘图,将其存储到临时文件(如上),然后通过ASCII-art generator(或this one)传递该PNG/JPG/...,输出然后显示在终端中。

    【讨论】:

    • 是的,这是一个很好的解决方案,不过,我最终又复制了一些东西。我更想知道,我是否可以在不需要复制文件的情况下“停留”在 shell 中。
    • Java ...是的,在问题 1853259 中,他们仍然使用 x-forwarding,而没有实际转发完整的接口。
    • @ernestopheles:查看我的编辑。不过,这需要一些工作,并且不确定质量。不过好主意;当我有时间的时候,我会打破这个头的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-09-21
    • 1970-01-01
    • 2020-07-16
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多