首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据使用GNUPlot的列中的值绘制单行/多行

如何根据使用GNUPlot的列中的值绘制单行/多行
EN

Stack Overflow用户
提问于 2014-06-20 10:24:53
回答 3查看 3.6K关注 0票数 6

我在使用gnuplot时遇到了一点小问题。这是我的数据文件:

代码语言:javascript
运行
复制
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")。

我想补充一下,如果可以更改列顺序的话。

我试过:

代码语言:javascript
运行
复制
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值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-28 15:42:35

这里有一个依赖于几个标准工具的解决方案,这些工具应该可以在任何标准Linux盒上使用,并且主要是基于bash的。让我们从您提供的数据文件开始,没有第一行

步骤1:每个字段将数据拆分为一个文件1:awk -f split.awk < data.log,并在split.awk中使用以下内容

代码语言:javascript
运行
复制
#!/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中使用其中一个字段作为标题使这一行在绘图时被忽略):

代码语言:javascript
运行
复制
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脚本(请参阅下面的完整脚本)。

代码语言:javascript
运行
复制
 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脚本。

使用您提供的数据,下面的脚本以如下方式结束:

可能会短一些,但我喜欢保持可读性。

完整脚本:

代码语言:javascript
运行
复制
#!/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
票数 2
EN

Stack Overflow用户

发布于 2014-06-30 08:44:51

这里有一个解决方案,它不需要外部文件。首先,我提取第一列中的所有不同源,并将它们存储在gnuplot变量中:

代码语言:javascript
运行
复制
filename = 'data.log'
from=system('tail -n +2 '.filename. '| cut -f 1 -d " " | sort | uniq')

对于绘图过程中的过滤,我使用awk并定义了gnuplot函数。

代码语言:javascript
运行
复制
select_source(w) = sprintf('< awk ''{if ($1 == "%s") print }'' %s', w, filename)

现在,您可以迭代存储在from中的所有源。完整的gnuplot脚本如下:

代码语言:javascript
运行
复制
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

票数 5
EN

Stack Overflow用户

发布于 2014-06-20 16:47:59

我不确定我是否理解你的问题,但至少我能回答How can I plot this two graphics in gnuplot ?

代码语言:javascript
运行
复制
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

将产生这样的结果:

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24325128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档