0

我有一个包含时间和值的日志文件,如下所示:

1 1
2 1
3 2
4 3
5 3
6 4
10 4
15 4
20 5
25 5 

绘制它 ( with linesp) 会产生如下内容:

5|                                 ,----x---------x
4|         ,x-------x---------x---'
3|     ,x-x
2|   ,x  
1|x-x 
 |___________________________________________________
  1 2 3 4 5 6 _ _ _10 _ _ _ _15 _ _ _ _20 _ _ _ _25

如果我的文件中有很多值,那么左边的点会变得非常拥挤(使用时with linesp)。如何设置明确定义的步长(跳过一些拥挤的元组)。例如,我想每 5 秒只绘制一个元组。

5|                                 ,----x---------x
4|          ,-------x---------x---'
3|     ,--x'
2|   ,'  
1|--' 
 |___________________________________________________
  1 2 3 4 5 6 _ _ _10 _ _ _ _15 _ _ _ _20 _ _ _ _25

最后,在那些稀疏的元组上,我想添加误差线(我目前在所有点上都有)。

4

2 回答 2

1

您可能可以使用 gnuplot 的内联函数功能来做到这一点,但这会非常棘手,而且如果您想修改它,您将永远无法记住您为使其工作所做的工作。相反,我提出了一个简单的 python 脚本来对数据进行分箱/平均:

from collections import defaultdict
from sys import argv

d = defaultdict(list)
binsize = 5
with open(argv[1]) as f:
    for line in f:
        x,y = [int(xx) for xx in line.split()]
        d[x//binsize].append((x,y))

    for k,v in sorted(d.items()):
        xx,yy = map(sum,zip(*v))
        #print float(xx)/len(v),float(yy)/len(v)  #This version puts x value at average of x points in this bin
        print (k+0.5)*binsize, float(yy)/len(v)  #x value is in middle of bin.

它将数据文件作为第一个参数传递,然后将数据打印到标准输出(就像 gnuplot 喜欢的那样)。然后你的绘图文件就变成了:

plot '< python cool_script.py datafile' u 1:2 w lp

首先,将 x 值推送到 bin 中心的版本:

在此处输入图像描述

现在具有从 bin 中所有其他 x vals 平均的 x 值的版本:

在此处输入图像描述

于 2012-11-09T20:07:22.707 回答
0

我不完全确定你在这里做什么。如果你有整数点,并且你只想在可以被 5 整除的点上放一个点,我们可以很容易地做到这一点:

plot 'foo.txt' u 1:2 w l, '' u (int($1)%5==0?$1:NaN):2 w p ls 1

这里的魔法是用三元运算符完成的。 (int($1)%5 == 0? $1:NaN)换句话说,如果 x 坐标可以被 5 整除(在转换为整数之后),则绘制该点,否则不绘制。

当然,如果您的数据文件 x 点是1,4,6,12因为没有一个点会被绘制(没有一个可以被 5 整除),那么您会遇到麻烦。如果是这种情况,我们可以编写一个真正的基本脚本,使用与我在另一篇文章中使用的基本相同的技术对这些点进行插值。

于 2012-11-09T20:18:23.953 回答