gnuplot stdin, how to plot two lines?

前端 未结 9 1480
栀梦
栀梦 2020-12-09 08:13

I\'m trying to produce a plot with two lines using data taken from stdin. I have a file \"test.csv\":

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

I\

相关标签:
9条回答
  • 2020-12-09 08:46

    Gnuplot can read from stdin, but for each plot statement, a new data set is required. The following works fine:

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

    The error appears as soon as you append the second plot command with , '' using 1:3. For this you need to send the data again as the first data set isn't stored interally for reuse. So for you two plot commands, the following snippet works fine:

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

    That writes the data file twice, separated by an e which indicates the end of the data for the first plot command.

    0 讨论(0)
  • 2020-12-09 08:46

    gnuplot seems to need random access (i.e. not stdin), so I think you're stuck with

    # explicitly open "test" file
    $ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
    
    0 讨论(0)
  • 2020-12-09 08:47

    The "-" is used to specify that the data follows the plot command. So if you use it, you'll need to do something like:

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

    (Quoting above probably needs to be escaped).

    What're you looking for is this:

    plot '< cat -'
    

    Now, you can do:

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

    Note that you might need to feed in the input data via stdin multiple times if you're using options with plot, like so:

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

    In the above case, testfile must end with a line that has the sole character 'e' in it.

    Manual reference

    0 讨论(0)
  • 2020-12-09 08:47

    Have you tried chart? Your case would be as easy as:

    cat test | chart line ','
    

    And would give you:

    0 讨论(0)
  • 2020-12-09 08:49

    I'd try converting the csv file to space separated (assuming no of the records span multiple lines) by piping it through sed instead of setting the separator:

    cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
    
    0 讨论(0)
  • 2020-12-09 08:50

    I had to do the following, since adding '-' did not work for me:

     cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout 
    
    0 讨论(0)
提交回复
热议问题