如何使用 gnuplot 创建 3d 相空间图?

如何使用 gnuplot 创建 3d 相空间图?

看看这个网页 -封闭但未加密

对于三维相空间图,序列 a、b、c、d、e、f 等可用作空间坐标 (ab、bc、cd)、(bc、cd、de)、(cd、de、ef) 等。创建的图中的模式揭示了后续序列之间的重复关系。在此相图中,50,000 个 16 位随机数将产生非结构化的点云。

我想要做同样的事情。我有一个二进制文件(大约 10 MB),我想创建一些漂亮的 gnuplot 样式图表,就像他们在那个网页上所做的那样。

我该在 gnuplot 中输入什么来实现这一点?

答案1

  1. 以适合 gnuplot 的格式创建二进制文件的转储。为方便起见,我使用了hexdump自定义输出格式,我们需要将其存储在文件中,例如gnuplot.hdp(原则上格式字符串可以通过命令行选项传递,但这样我们会在 gnuplot 脚本中遇到太多嵌套引号):

    $ cat gnuplot.hdp
    3/1 "%03d " "\n"
    
    $ hexdump -f gnuplot.hdp random.data | head -n 4
    236 027 076
    070 243 055
    047 115 211
    184 206 073
    
  2. 使用 gnuplot 绘制数据。在最简单的情况下,我们将字节等绘制1, 2, 34, 5, 6坐标x, y, z

    set parametric
    unset border
    unset xtics
    unset ytics
    unset ztics
    splot "< hexdump -f gnuplot.hdp random.data" using ($1):($2):($3) notitle
    

    一个包含随机数的文件显示出——这并不奇怪——一个相当随机的散点图:

    在此处输入图片描述

    但是如果我们使用例如压缩严重的文件(例如简单的位图),我们会看到一个结构(这里是一行):

    在此处输入图片描述

  3. 如果我们想更好地模仿所引用文章中的图,我们需要6/1 "%03d " "\n"ashexdump格式,这样每行就有六个字节。我们必须splot在 gnuplot 中扩展命令:

    splot "< hexdump -f gnuplot.hdp random.data" u ($1-$2):($2-$3):($3-$4) ls 1 not, '' u ($2-$3):($3-$4):($4-$5) ls 1 not, '' u ($3-$4):($4-$5):($5-$6) ls 1 not
    

    gnuplot将其视为和的u缩写,以保持简短。usingnotnotitle

    对于位图我们现在得到一个好看的对象;

    在此处输入图片描述

    随机数据如下:

    在此处输入图片描述

  4. 请注意,我们以 6 个字节的块来分析数据,即,如果只有第 6 个和第 7 个字节(或这些字节的倍数)相关,则图表不会显示这一点。

  5. gnuplot应该可以轻松处理 10MB 的输入文件,但旋转可能会变得很慢——这取决于您的计算能力。

相关内容