pipe plot data to gnuplot script

后端 未结 6 1999
终归单人心
终归单人心 2020-12-02 14:49

I want to create a gnuplot with three plots in it. The data should be inline (as I want to only

It should look like this:

相关标签:
6条回答
  • 2020-12-02 15:05

    Mix both answers :

    cat data.txt | gnuplot -e "set terminal png; set output "test.png"; plot for[col=2:4] '<cat' using 1:col title columnheader(col) with lines
    
    0 讨论(0)
  • 2020-12-02 15:06

    How about using the system() command

    set terminal png
    set output "test.png"
    
    # read shell input
    # the echo prints the variable, which is then piped to gnuplot
    fname = system("read filename; echo $filename")
    
    plot for[col=2:4] fname using 1:col title columnheader(col) with lines 
    

    You can call it now with

    echo "data.txt" | gnuplot script.gp
    
    0 讨论(0)
  • 2020-12-02 15:09

    not a direct answer but this is what i use to quickly look at data. it's especially helpful with the cut command

    cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
    
    0 讨论(0)
  • 2020-12-02 15:16

    If you are on a Unix system (i.e. not Windows) you can use '<cat' instead of '-' to read from stdin:

    plot '<cat' using ...
    

    Then you can do cat data.txt | gnuplot script.gp. However, in the specific case you mention in your question, with the plot in the for loop, you read the input three times. So sending the data through stdin is not appropriate, since the data will be gone after the first time it is read.

    0 讨论(0)
  • 2020-12-02 15:22

    If you want to plot data coming from a pipe more than once, you need to store it somehow in memory. My preferred way is to use a temporary file in /dev/shm, which exists in most Linux systems and maps to RAM. Just to keep things clean, I set a trap to delete the temporary file at exit.

    Example (using your data.txt):

    cat data.txt | (cat > /dev/shm/mytempfile && trap 'rm /dev/shm/mytempfile' EXIT && gnuplot -e "set terminal dumb; plot for[col=2:4] '/dev/shm/mytempfile' using 1:col title columnheader(col) with lines")
    

    Result:

    12 ++------------+-------------+-------------+-------------+------------**
       +             +             +             +             + Best ****** +
       |                                                        Worst***#### |
    10 ++                                              *******Average $$$$$$++
       |                                           ****                      |
       |                                        ***    $$$$               $$$$
     8 ++                                     **     $$    $$        $$$$$  ++
       |                                    **     $$        $$    $$        |
       |                               *****    $$$              $$       ####
     6 ++                          ****       $$ ############# $$    #####  ++
       |                         **         $$ ##             #  ####        |
       |                       **        $$$ ##                ##            |
       |                     **      $$$$  ##                                |
     4 ++         ***********   $$$$$  ####                                 ++
       |     *****  ###################                                      |
       | ****   $$##                                                         |
     2 **    $$$##                                                          ++
       #########                                                             |
       + $$          +             +             +             +             +
     0 $$------------+-------------+-------------+-------------+------------++
       0             2             4             6             8             10
    
    0 讨论(0)
  • 2020-12-02 15:24

    What's wrong with using the -e option of gnuplot from shell? You can provide a variable as input, say data.txt, from shell using:

    gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu
    

    You should be able to call the above command multiple times with different values for "filename" from shell using a for loop.

    And then you change your script plot.gnu to:

    set terminal png
    set output ofilename
    plot for[col=2:4] filename using 1:col title columnheader(col) with lines
    
    0 讨论(0)
提交回复
热议问题