首页 > 解决方案 > 通过 Shell 命令生成 Gnuplot 数据块

问题描述

我有一个相当昂贵的 shell 命令,它会生成一些应该被绘制的输出。输出包含多条曲线的信息,例如:

echo 1 2 3; echo 4 5 6; echo 7 8 9

它们应该使用如下命令绘制:

plot <something> using 1:2, \
     <something> using 1:3

为了避免重复调用 shell 命令(因为它相当慢),我想将其结果存储在数据块中,但到目前为止我的试验没有奏效。这是我尝试过的:

output = system("echo 1 2 3; echo 4 5 6; echo 7 8 9")
set print $DATA
print output
unset print

现在我似乎有一个包含我想要的数据块,因为print $DATA现在打印:

1 2 3
4 5 6
7 8 9
   

我希望后面的空行不是问题,但也许它表明有问题,我不知道。

当我现在尝试绘制这个时,plot $DATA using 1:2我只得到三个预期点(1|2)、(4|5)和(7|8)中的第一个。

我觉得可能有一种更简单的方法可以实现我最初的目标,但到目前为止我还没有找到它。

标签: shellgnuplot

解决方案


现在我似乎有一个包含我想要的数据块,因为print $DATA现在打印:

1 2 3
4 5 6 
7 8 9 

不,$DATA不包含您想要的。$DATA 应该是一个包含三个元素的数组:第一个元素是1 2 3,第二个元素是4 5 6,第三个元素是7 8 9。相反, , 和 的组合会output = system("...")生成set print $DATA一个只有一个元素:print output的数组,打印到数据块中不会将字符串拆分为单独的行。1 2 3\n4 5 6\n7 8 9

用 是看不到差异的print $DATA。数据块的新数组元素以及\n数组元素内的新数组元素都会生成换行符。

您可以使用该load '< XXXXX'命令生成有用的数据块。从 gnuplot 文档中:

load命令执行指定输入文件的每一行,就好像它是交互式输入的一样。

...

在某些支持 popen 函数 (Unix) 的系统上,可以通过以“<”开头的文件名从管道中读取加载文件。

“XXXXX”可以是一系列生成必要的 gnuplot 命令的 shell 命令:

load '< echo "\$DATA << EOD" && echo 1 2 3; echo 4 5 6; echo 7 8 9 && echo "EOD"'
print $DATA
plot $DATA using 1:2 pt 5, $DATA using 1:3 pt 7 

(灵感来自gnuplot:将数据文件 1:1 加载到数据块中)


推荐阅读