【问题标题】:gnuplot stdin, how to plot two lines?gnuplot stdin,如何绘制两条线?
【发布时间】:2011-06-02 21:57:15
【问题描述】:

我正在尝试使用从标准输入中获取的数据生成一个包含两条线的图。我有一个文件“test.csv”:

0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6

我一直在尝试用类似的命令来绘制它,

$ cat test | gnuplot -p -e "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;"

但无论我尝试什么,我都会得到,

line 5: warning: Skipping data file with no valid points

我认为这是因为对于第二行,stdin 已经用尽了。有没有办法让 gnuplot 从标准输入的每一列中为不同的图获取数据?

谢谢。

【问题讨论】:

  • 可以使用set 命令代替using 子句吗?也许这可以允许使用replot?...嗯,可能不理想;我们想要一个plot 命令,对吧?

标签: gnuplot


【解决方案1】:

也许这是一个老问题,但我根据其他答案找到了一个有趣的解决方案:

cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -

输出将是:

"contents of filename"
e
"contents of filename"
e
"contents of filename"
e

现在catawk 照常工作,另一方面,实用程序tee 允许我们将标准输出从上一个命令通过管道复制到一个文件中,但是这个文件可以是stdin 本身,因此我们可以通过在 -a 之后指定 n- 来复制它。

选项-i 阻止它在复制期间被信号中断,-a 告诉它将输入附加到标准输入而不覆盖,然后将整个内容写入 stdout。 p>

参考Tee Utility

【讨论】:

  • 使用tee 实用程序看起来不错,但是您发布的命令行对我来说根本不起作用。我对gawkmawk 都进行了尝试,但我只得到了三个e 作为输出(我在cat 中使用了一个真实文件)。
  • 你说得对,我忘了在 awk 脚本中添加 {print $0},我将编辑答案以修复它
  • tee 写入其所有参数,包括标准输出,如果有足够的行,数据将混合。您可以通过向 tee 发送许多行来看到这一点,例如。带序列号:seq 10000 | tee -i -a -.
【解决方案2】:

我必须执行以下操作,因为添加“-”对我不起作用:

 cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout 

【讨论】:

    【解决方案3】:

    你试过chart吗?您的情况很简单:

    cat test | chart line ','
    

    并且会给你:

    【讨论】:

      【解决方案4】:

      “-”用于指定数据遵循绘图命令。因此,如果您使用它,您需要执行以下操作:

      echo "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p
      

      (上面的引用可能需要转义)。

      你要找的是这个:

      plot '< cat -'
      

      现在,你可以这样做了:

      cat test | sed ... | gnuplot -p "plot '< cat -' using ..."
      

      请注意,如果您使用带有绘图的选项,您可能需要多次通过标准输入输入数据,如下所示:

      cat testfile testfile | gnuplot -p "plot '< cat -' using 1, '' using 2"
      

      在上述情况下,testfile 必须以包含唯一字符 'e' 的行结束。

      Manual reference

      【讨论】:

        【解决方案5】:

        Gnuplot 可以从标准输入读取,但是对于每个绘图语句,都需要一个新的数据集。以下工作正常:

        cat test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l"
        

        当您将第二个绘图命令附加到 , '' using 1:3 时,错误就会出现。为此,您需要再次发送数据,因为第一个数据集没有在内部存储以供重复使用。因此,对于您的两个绘图命令,以下 sn-p 可以正常工作:

        echo 'e' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l, '' using 1:3 w l"
        

        两次写入数据文件,以e 分隔,表示第一个绘图命令的数据结束。

        【讨论】:

          【解决方案6】:

          gnuplot 似乎需要随机访问(即不是标准输入),所以我认为你被困住了

          # explicitly open "test" file
          $ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
          

          【讨论】:

          • 是的,它可以从标准输入读取,但你仍然需要一个临时文件,所以为什么不把它传入呢?
          • 好吧,如果你有一个文件,这没有多大意义。但它解释了错误:)
          【解决方案7】:

          我设法通过发送数据两次来解决这个问题,在每个块之后在它自己的行上以 am "e" 终止。 所以你的输入应该看起来像

          set datafile separator ","; plot '-' using 1:2 with lines, '' using 1:3 with lines
          0,1.1,2
          1,2,3
          2,6,4
          4,4.6,5
          5,5,6
          e
          0,1.1,2
          1,2,3
          2,6,4
          4,4.6,5
          5,5,6
          e
          

          【讨论】:

          • 有没有办法将每个图中的数据放在一条线上。例如:0,1.1,2 1,2,3 2,6,4 4,4.6,5 5,5,6 e
          【解决方案8】:

          对我来说,这在我这样做时有效:

          set datafile separator ','
          plot "test.csv" using 1:2 with lines
          

          您似乎使用“,”作为数据文件分隔符而不是“,”

          【讨论】:

          • 引号没有区别。问题在于stdin,而不是分隔符。在您的示例中,您指定了test.csv,它确实可以正常工作,但不能回答问题。
          【解决方案9】:

          我会尝试通过sed 管道而不是设置分隔符,将 csv 文件转换为空格分隔(假设没有记录跨越多行):

          cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
          

          【讨论】:

          • 哦,我想我刚刚看到了。您在 plot 命令的第二部分中缺少破折号。让它plot '-' using 1:2 with lines, '-' using 1:3 with lines;,我认为它应该可以工作。
          • 不,抱歉。缺少的破折号仅表示“使用与以前相同的文件”。
          猜你喜欢
          • 2017-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多