我在使用gnuplot时遇到了一点小问题。这是我的数据文件:
From Time Packets Jitter
127.0.0.1:53091 1 0 274
127.0.0.1:53091 2 0 417
127.0.0.1:53091 3 36 53
127.0.0.1:53091 4 215 55
127.0.0.1:53090 4 215 55
127.0.0.1:53091 5 215 33
127.0.0.1:53090 6 256 78
(我把那个“时间”作为测试的时间,但在它生效后,它将被一个日期时间所取代)
我想绘制两种不同的图形,其中x轴上有Time
列,y轴上有Packets
列(在第一张图形上)&抖动列(在第二张图形上)。但是,正如您可能已经看到的,我不知道与From
列有多少不同的值(最小值1,但不知道最大值,数据文件将被刷新,一些值将每x秒添加一次)。
因此,我的问题是,我想在这两种图形上每一个不同的From
值创建另一条“行”。
实际上,在标题中有From
值(例如:"127.0.0.1:53091")。
我想补充一下,如果可以更改列顺序的话。
我试过:
plot 'data.log' using 3:xtic(2) title 'Packets' with lines, \
'data.log' using 4:xtic(2) title 'Jitter' with lines
但它是在相同的图形(我还没有使用多重绘图,我试图使多行之前)。
有可能吗?如果是的话,我如何绘制这两个图形的gnuplot?
如果没有,我们可以删除Jitter
图形,只在单个图形上绘制Packets
列,但使用不同的From
值。
发布于 2014-06-28 15:42:35
这里有一个依赖于几个标准工具的解决方案,这些工具应该可以在任何标准Linux盒上使用,并且主要是基于bash的。让我们从您提供的数据文件开始,没有第一行。
步骤1:每个字段将数据拆分为一个文件1:awk -f split.awk < data.log
,并在split.awk
中使用以下内容
#!/usr/bin/awk -f
# erase previous files
BEGIN { system("rm file_*.dat"); }
# print each line in a specific file
{ print $0 >>( "file_" $1 ".dat") }
步骤2:复制每个生成的数据文件的第一行(因为在gnuplot中使用其中一个字段作为标题使这一行在绘图时被忽略):
for f in `ls file_*.dat`; do
head -n 1 $f > tmp.dat
cat $f >> tmp.dat
mv tmp.dat $f
done;
步骤3:生成一个包含绘制不同文件的plot
命令的gnuplot脚本(请参阅下面的完整脚本)。
echo "plot \\" >> plot.plt
for f in `ls file_*.dat`; do
echo " '$f' using 2:3 title columnheader(1) with linespoints lw 2, \\" >> plot.plt
done;
echo " 0 notitle" >> plot.plt
FIY,最后一个"0“图之所以存在,仅仅是因为要将多个文件绘制到一个单独的图上,gnuplot需要行尾的反斜杠。如果有一个,并且在下一行没有任何可绘制的地方,则生成一个错误。所以我只能找到这个愚蠢的伎俩让它起作用..。
步骤4:调用生成的gnuplot脚本。
使用您提供的数据,下面的脚本以如下方式结束:
可能会短一些,但我喜欢保持可读性。
完整脚本:
#!/bin/bash
# 1 - split data into one file per field 1
awk -f split.awk < data.log
# 2 - duplicate first line (useful for gnuplot)
for f in `ls file_*.dat`; do
head -n 1 $f > tmp.dat
cat $f >> tmp.dat
mv tmp.dat $f
done;
# 3 - generate gnuplot script
echo "set terminal pngcairo size 800,500" > plot.plt
echo "set output 'b.png'" >> plot.plt
echo "set multiplot layout 1,2" >> plot.plt
echo "set title 'Packets'" >> plot.plt
echo "plot \\" >> plot.plt
for f in `ls file_*.dat`; do
echo " '$f' using 2:3 title columnheader(1) with linespoints lw 2, \\" >> plot.plt
done;
echo " 0 notitle" >> plot.plt
echo "set title 'Jitter'" >> plot.plt
echo "plot \\" >> plot.plt
for f in `ls file_*.dat`; do
echo " '$f' using 2:4 title columnheader(1) with linespoints lw 2, \\" >> plot.plt
done;
echo " 0 notitle" >> plot.plt
echo "unset multiplot" >> plot.plt
# 4 - call gnuplot script
gnuplot plot.plt
发布于 2014-06-30 08:44:51
这里有一个解决方案,它不需要外部文件。首先,我提取第一列中的所有不同源,并将它们存储在gnuplot变量中:
filename = 'data.log'
from=system('tail -n +2 '.filename. '| cut -f 1 -d " " | sort | uniq')
对于绘图过程中的过滤,我使用awk
并定义了gnuplot函数。
select_source(w) = sprintf('< awk ''{if ($1 == "%s") print }'' %s', w, filename)
现在,您可以迭代存储在from
中的所有源。完整的gnuplot脚本如下:
filename = 'data.log'
from=system('tail -n +2 '.filename. '| cut -f 1 -d " " | sort | uniq')
select_source(w) = sprintf('< awk ''{if ($1 == "%s") print }'' %s', w, filename)
set style data linespoints
set multiplot layout 1,2
set title 'Packets'
plot for [f in from] select_source(f) using 2:3 title f
set title 'Jitter'
plot for [f in from] select_source(f) using 2:4 title f
unset multiplot
发布于 2014-06-20 16:47:59
我不确定我是否理解你的问题,但至少我能回答How can I plot this two graphics in gnuplot ?
set multiplot layout 1,2
plot 'data.log' using 3:xtic(2) title 'Packets' with lines
plot 'data.log' using 4:xtic(2) title 'Jitter' with lines
unset multiplot
将产生这样的结果:
https://stackoverflow.com/questions/24325128
复制相似问题