gnuplot:绘制具有固定步长的混合频率日志数据

时间:2012-11-09 17:53:09

标签: gnuplot

我有一个时间和值的日志文件:

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

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

2 个答案:

答案 0 :(得分:1)

你可能可以使用gnuplot的内联函数功能来做到这一点,但它会非常棘手,如果你想修改它,你将永远无法记住你做了什么让它工作。相反,我提出了一个简单的python脚本来对数据进行bin / average:

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.

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

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

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

enter image description here

现在,版本中x值的平均值来自bin中的所有其他x个值:

enter image description here

答案 1 :(得分: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-points是1,4,6,12,你就会遇到麻烦,因为没有一个点被绘制(没有一个可以被5整除)。如果是这种情况,我们可以使用与我在其他帖子中使用的技术基本相同的技术,编写一个真实的基本脚本来插入这些点。