我想创建一个包含三个图的gnuplot。 数据应该是内联的(因为我只想
)它应该是这样的:
目前我正在使用以下gnuplot脚本来创建绘图:
set terminal png
set output "test.png"
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines
文件data.txt
是:
Generation Best Worst Average
0 2 1 0
1 3 1 2
2 4 3 3
3 4 3 3
4 6 3 4
5 7 4 5
6 9 6 7
7 10 6 9
8 10 5 6
9 11 6 8
10 12 7 9
我想将data.txt传递给gnuplot,而不是依赖于脚本中引用的数据文件。
像cat data.txt | gnuplot plot.gnu
这样的东西。
原因是,我有几个data.txt
个文件,并且不想为每个文件构建一个plot.gnu
文件。
我读到了特殊的'-'
文件in this stackoverflow thread,并且我读到了multiple plots in one file。但是,这需要包含gnuplot代码的数据,这不是干净的。
答案 0 :(得分:24)
如果您使用的是Unix系统(即非Windows),则可以使用'<cat'
代替'-'
从stdin读取:
plot '<cat' using ...
然后你可以cat data.txt | gnuplot script.gp
。但是,在您在问题中提到的特定情况下,使用for循环中的绘图,您将读取输入三次。因此,通过stdin发送数据是不合适的,因为数据在第一次读取后就会消失。
答案 1 :(得分:18)
不是直接的答案,但这是我用来快速查看数据的方法。它对cut
命令
cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
答案 2 :(得分:12)
从shell使用gnuplot的-e选项有什么问题? 您可以使用以下命令从shell提供变量作为输入,例如data.txt:
gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu
您应该可以使用for循环从shell调用上述命令多次使用不同的“filename”值。
然后将脚本plot.gnu更改为:
set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
答案 3 :(得分:12)
如果要多次绘制来自管道的数据,则需要以某种方式将其存储在内存中。我首选的方法是使用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")
中的临时文件,该文件存在于大多数Linux系统中并映射到RAM。为了保持清洁,我设置了一个陷阱,以便在退出时删除临时文件。
示例(使用您的data.txt):
12 ++------------+-------------+-------------+-------------+------------**
+ + + + + Best ****** +
| Worst***#### |
10 ++ *******Average $$$$$$++
| **** |
| *** $$$$ $$$$
8 ++ ** $$ $$ $$$$$ ++
| ** $$ $$ $$ |
| ***** $$$ $$ ####
6 ++ **** $$ ############# $$ ##### ++
| ** $$ ## # #### |
| ** $$$ ## ## |
| ** $$$$ ## |
4 ++ *********** $$$$$ #### ++
| ***** ################### |
| **** $$## |
2 ** $$$## ++
######### |
+ $$ + + + + +
0 $$------------+-------------+-------------+-------------+------------++
0 2 4 6 8 10
结果:
{{1}}
答案 4 :(得分:2)
如何使用system()命令
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
您现在可以使用
调用它echo "data.txt" | gnuplot script.gp
答案 5 :(得分:-2)
混合两个答案:
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