我正在绘制gnuplot中大量文件的创建时间,以查看它们是否是及时线性创建的(它们不是)。
这是我的代码:
#!/bin/bash
stat -c %Y img2/*png > timedata
echo "set terminal postscript enhanced colour
set output 'file_creation_time.eps'
plot 'timedata'" | gnuplot
我遇到的问题是y数据是自unix开始时间以秒为单位的创建时间,因此该图在y轴上只有1.333 ... e + 09。我希望将第一个文件的创建时间缩放为零,以便相对创建时间可读。
我在许多数据绘图上下文中遇到了这个问题,所以我希望能够在gnuplot中执行此操作,而不是使用awk或某些实用程序来预处理数据。
我知道第一次将是最小的,因为文件是按顺序命名的,所以有没有办法访问文件中的第一个元素,比如
`plot 'data' using ($1-$1[firstelement])`
答案 0 :(得分:4)
我认为你可以做那样的事情......(以下是未经测试的,但我认为它应该有用......)。基本上,您必须绘制两次文件 - 第一次通过gnuplot获取有关数据集的统计信息。第二次,您使用在第一次运行中找到的内容来绘制您真正想要的内容。
set terminal unknown
plot 'datafile' using 1:2
set terminal post enh eps color
set output 'myfile.eps'
YMIN=GPVAL_Y_MIN
plot '' u 1:($2-YMIN)
如果你有gnuplot 4.6,你可以用stats
命令做同样的事情。
http://www.gnuplot.info/demo/stats.html
编辑您希望第一个点提供偏移(抱歉,误读了问题)......
如果你想要第一个点提供偏移量,你可以做一些事情(再次,未经测试 - 需要gnuplot> = 4.3):
first=0;
offset=0;
func(x)=(offset=(first==0)?x:offset,first=1,x-offset)
plot 'datafile' using (func($1))
答案 1 :(得分:1)
Gnuplot接受unix命令,所以你可以说类似
gnuplot> plot "< tail -3 test.dat" using 1:2 with lines
为了绘制最后三行。你可以使用这样的东西来达到你的目的。此外,如果你想从第1000行到第2000行绘图,那么
plot "<(sed -n '1000,2000p' filename.txt)" using 1:2 with lines
您可以查看this website,了解更多示例。
答案 2 :(得分:0)
我找到了一个相关的stackoverflow问题here,并从其中一个答案中利用了awk脚本:
#!/bin/bash
stat -c %Y img2/*png > timedata
echo "set terminal postscript enhanced colour
set output 'file_creation_time.eps'
unset key
set xlabel 'file number'
set ylabel 'file creation time (after first)'
plot \"<awk '{if(NR==1) {shift = \$1} print (\$1 - shift)}' timedata\"" | gnuplot
输出看起来像这样(这些不是我在我的问题中讨论的数据,但类似):
因此,gnuplot可以做我想要的,但它确实依赖于UNIX环境...
我也尝试过mgilson的方法:
plot 'timedata'
YMIN=GPVAL_Y_MIN
plot '' u ($1-YMIN)
但是gnuplot(我的版本是4.4.2)没有找到正确的最小值。它接近了;看起来它的绘制使得y范围的最小值为0: