如何在gnuplot中创建一个自动从y数据中减去的最低值?

时间:2012-04-05 19:35:42

标签: bash gnuplot

我正在绘制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])`

3 个答案:

答案 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

输出看起来像这样(这些不是我在我的问题中讨论的数据,但类似): enter image description here

因此,gnuplot可以做我想要的,但它确实依赖于UNIX环境...

我也尝试过mgilson的方法:

plot 'timedata'
YMIN=GPVAL_Y_MIN
plot '' u ($1-YMIN)

但是gnuplot(我的版本是4.4.2)没有找到正确的最小值。它接近了;看起来它的绘制使得y范围的最小值为0: enter image description here