我有一个时间和值的日志文件:
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
最后,在那些稀疏元组中,我想添加误差条(我目前在所有点上都有)。
答案 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中心的版本:
现在,版本中x值的平均值来自bin中的所有其他x个值:
答案 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整除)。如果是这种情况,我们可以使用与我在其他帖子中使用的技术基本相同的技术,编写一个真实的基本脚本来插入这些点。