5

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

?

4

3 回答 3

5

我认为你可以做这样的事情......(以下内容未经测试,但我认为它应该可以工作......)。基本上,您必须绘制文件两次——第一次通过 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))
于 2012-04-06T02:59:09.050 回答
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 

您可以查看此网站以获取更多示例。

于 2012-04-05T21:25:29.837 回答
0

我在这里找到了一个相关的 stackoverflow 问题,并从其中一个答案中利用了 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: 在此处输入图像描述

于 2012-04-06T04:06:59.920 回答