通过Shell命令生成Gnuplot数据块

问题描述 投票:0回答:2

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

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)中的第一个。

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

shell gnuplot
2个回答
0
投票

假设我正确理解了您的问题,我看到了应该在版本2和版本3中起作用的三个版本。我想版本2是您想要避免的。我只能猜测为什么第一个版本不起作用。我怀疑行尾字符。如果写入数据块(版本1)或文件(版本3),似乎有所不同。我记得曾与@Ethan讨论过此事……但我仍然不了解自己。我假设您正在使用Linux,在Windows中使用&而不是;

代码:

### system output to datablock
reset session

# Version 1
set title "Version 1: only plots 1st data line"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9")   # in Windows "&" instead of ";"
set print $Data
    print output
set print
plot $Data u 1:2 w lp pt 7
pause -1

# Version 2
set title "Version 2: several system calls"
set print $Data
    print system("echo 1 2 3")
    print system("echo 4 5 6")
    print system("echo 7 8 9")
set print
plot $Data u 1:2 w lp pt 7
pause -1

# Version 3
set title "Version 3: writing into data file"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9")   # in Windows "&" instead of ";"
set print "Data.dat"
    print output
set print
plot "Data.dat" u 1:2 w lp pt 7

### end of code

0
投票

现在我似乎有一个包含我想要的数据块,因为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 $DATAprint output的组合将生成具有仅一个元素1 2 3\n4 5 6\n7 8 9的数组,打印到数据块中不会将字符串分成单独的行。

print $DATA看不到差异。数据块的新数组元素以及数组元素中的\n两者都产生换行符。

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

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

...

[在某些支持popen函数(Unix)的系统上,可以通过以'

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

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: load datafile 1:1 into datablock启发)

© www.soinside.com 2019 - 2024. All rights reserved.