【问题标题】:gnuplot: plot input data obtained through pipegnuplot:绘制通过管道获得的输入数据
【发布时间】:2023-02-01 07:05:46
【问题描述】:

这是一个有点奇怪的查询,可能更多地证明了我对 bash 的无知,而不是一个简单的帮助请求。再一次,有人可能会给出完美的答案——这会让我省去很多头疼的事情。

我想创建一个简单的 gnuplot 命令来生成一个图,重复不同的数据。虽然目前我可能不得不将数据保存到 /dev/shm 中的临时文件中,但我真的不想这样做。当我本能地做的是通过管道传递数据时,感觉就像是不必要的复杂性。然而,就在我认为我怀疑它的时候(感谢theozh),实验证明我错了。

我从文件 stack.gp 开始,如下所示:

### bar chart with conditional color
data = '/dev/stdin'
lhb = ARG1
myColor(col) = (_s=strcol(col), _s eq lhb ? 0xff3333 : 0x3333ff)

set style fill solid 0.5
set key noautotitle

stats data using 0:2 nooutput
set label 1 at STATS_max_x, STATS_mean_y sprintf("mean=%.1f",STATS_mean_y) offset 0,0.7 right

plot data using 0:2:(myColor(1)):xtic(1) w boxes lc rgb var, \
     STATS_mean_y w l lw 2 lc "web-green"

据我了解,这里重要的是:

  1. 第一行,存放传入数据的地方;和
  2. 事实上,该数据被处理了不止一次(因为我可以轻松地做我想做的事,只要我没有 stats 命令)。

    数据是一个非常简单的两列表:

    A 8
    B 6
    C 4
    D 3
    

    我可以使用以下命令生成输出:

    < test.dat gnuplot --persist -c stack.gp 'C' 
    

    完美的!但它不是,因为它使用了一个临时文件 (test.dat)。什么我实际上打算做的是通过管道输入数据,类似于这种方法:

    cat otherfile.txt | awk ... | gnuplot -c stack.gp 'C'
    

    这不适用于原始脚本(没有有效数据点),但如果我删除我的统计命令以便数据只处理一次,它确实有效。因此,让我们尝试其他几种方法:

    1. 数据 = '<猫'
    2. 数据='-'

      (1) 再次工作一次通过, 但否则给出“x 范围无效”(2) 要么给“x 范围无效”或者“在文件中找不到有效的数据点”取决于 1 遍或 2 遍处理。啊!

      那么,还有另一种方法吗?曾经可能是我首先开始使用 gnuplot 的原因,它是 perl 帮助程序脚本feedgnuplot。但是,到目前为止,我也没有设法使它正常工作。

      帖子 https://unix.stackexchange.com/questions/671446 更详细一些。类似讨论:how to make several plots from the same standard input data in gnuplot?

      固执,逻辑表明这是可能的,因为我可以创建随机测试数据(使用设置表 $Data) 然后进行分析。如果我能做到这一点,那么我肯定可以用管道数据的内容填充 $Data 吗?使用标准输入时我显然没有正确填充它......

      有解决办法吗?或者这对于当前版本的 gnuplot 来说是不可能的吗?

【问题讨论】:

    标签: pipe gnuplot


    【解决方案1】:

    我可以想到至少两种方法。可能还有其他人。

    方法一:

    您可以将管道数据包装在开始和结束行中,以告诉 gnuplot 将其存储为此处文档以供以后使用。 gnuplot 想要看到的是:

    $DATA << EOD
     ... data ...
     ... data ...
     ...
    EOD
    

    包装(附加的第一行和最后一行)可以由生成数据的程序完成,也可以通过 awk 或其他一些命令行位集进行管道添加。这是一个模型:

    cat part2.gp
       print $DATA
       stats $DATA
       plot $DATA
    
    echo '$DATA << EOD
     2 1 
     3 0 
     4 4 
    EOD' | gnuplot '-' part2.gp
    

    方法二:

    您可以告诉 gnuplot 从其他 fd 读取,而不是通过 stdin 进行管道传输。这是手册中的相关文本(“帮助管道数据”):

     On systems with an fdopen() function, data can be read from an arbitrary file
     descriptor attached to either a file or pipe.  To read from file descriptor
     `n` use `'<&n'`.  This allows you to easily pipe in several data files in a
     single call from a POSIX shell:
    
           $ gnuplot -p -e "plot '<&3', '<&4'" 3<data-3 4<data-4
           $ ./gnuplot 5< <(myprogram -with -options)
           gnuplot> plot '<&5'
    

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多