gnuplot自动排序次

时间:2016-03-03 13:04:23

标签: linux charts gnuplot

我有一个文件如下:

19:40:47,2772
19:41:50,2896
19:42:50,2870
19:43:51,2851
19:44:53,2824
19:45:55,2891
.
.
.
07:52:53,2772
07:53:56,2767
07:55:00,2709
07:56:01,2713
07:57:04,2844
07:58:04,2750
07:59:05,2744
08:00:08,2812
08:01:11,2728
08:02:14,2852

我试图做一个简单的任务,用时间X轴制作图形&数字Y轴。

代码如下:

#!/usr/bin/gnuplot

unset multiplot
set xdata time
set datafile separator ","

set timefmt "%H:%M:%S"
set format x "%H:%M"



set title "defect number"

set xlabel "X"
set ylabel "Y"

plot "Defect_number_03-03-16_08.04.49.csv" using 1:2 w lines
pause -1

问题是gnuplot自动调整时间,我的图表如下所示:

example

我想根据文件中的顺序制作图表,任何帮助都会很棒=)

2 个答案:

答案 0 :(得分:0)

当你给出情节命令时

plot datafile u 1:2

你告诉gnuplot第一列是你的x值,第二列是你的y值。当然,较早的时间是在左侧(因为您没有发布完整的数据,我只使用了您发布的部分 - 这将导致轴标签中的“跳过”)。

enter image description here

您可以使用伪列将行号用作x值。 0 列对应于行号(请参阅help pseudocolumns)。

因此plot datafile u 0:2将使用行号作为x坐标,将第2列作为y坐标。

enter image description here

我们仍然需要添加正确的x轴标签,在这种情况下不能依赖它们正确生成。我们将使用xtic函数来执行此操作,因为 1

plot datafile u 0:2:xtic(1)

enter image description here

告诉gnuplot将第1列中的值用作xtic,但它会按字面意思读取,而不是按照您所希望的时间格式化它。为此,我们可以手动将其转换为正确的字符串

plot datafile u 0:2:xtic(strftime("%H:%M",strptime("%H:%M:%S",strcol(1)))) w lines

enter image description here

这里,strcol函数将第1列作为字符串读取,strptime函数将其转换为内部时间表示,使用指定的格式字符串进行读取,最后strftime使用指定的输出字符串将其格式化为时间字符串。

正如克里斯托夫在回答中所说,这些解决方案将导致点的均匀间隔。如果这些点已经是均匀间隔,这不是问题,如果这些点非常接近均匀间隔,那么它也可能是可接受的(看起来你的点相距大约1分钟给出或需要几秒钟)

但是,如果我们想要绝对正确的间距,我们需要在线上添加日期。这可以在创建期间在原始数据文件中完成,或者我们可以使用外部进程仅在需要时添加日期,使原始文件完全相同。

由于您只标记时间而不是标记日期,实际日期并不重要。重要的是第二天早上的时间是从昨晚起的第二天。

我们可以使用外部程序添加日期。以下python 3程序读取数据文件并向其添加日期(使用2015年1月1日的第一个日期 - 如前所述,此日期并不重要)。如果时间发生在前一天的某一天,它将移至第二天。这是程序 adddates.py

from datetime import datetime,timedelta
from sys import argv

last = None
offset = timedelta(days=0)
for x in open(argv[1],"r"):
    vals = x.split(",")
    dte = datetime.strptime("01/01/2015 "+vals[0],"%m/%d/%Y %H:%M:%S") + offset
    if last!=None and last>dte:
        offset+= timedelta(days=1)
        dte = dte + offset
    last = dte
    print(dte.strftime("%Y-%m-%d %H:%M:%S"),vals[1],sep=",",end="")

在数据文件上运行此命令的输出如下所示:

2015-01-01 19:40:47,2772
2015-01-01 19:41:50,2896
2015-01-01 19:42:50,2870
2015-01-01 19:43:51,2851
2015-01-01 19:44:53,2824
2015-01-01 19:45:55,2891
...
2015-01-02 07:52:53,2772
2015-01-02 07:53:56,2767
...

我们现在可以通过在plot命令中打开一个管道来读取该程序中的数据。

set timefmt "%Y-%m-%d %H:%M:%S"
plot "< adddates.py datafile" u 1:2 with lines

enter image description here

<小时/> 1 请注意,这也会导致标签重叠,因为它会使用所有标签。要使用其他每一个,我们可以使用xtic(int($0) % 2 == 0 ? strcol(1):"")。类似的技术也可以使用正确的标签格式。

答案 1 :(得分:0)

正确的解决方案是使用完整日期和时间或时间戳保存数据。 使用$0并使用xticlabel标记xtics的所有其他解决方案要求您的数据等距离为空格,但似乎并非如此。

因此,只需将您的数据另存为例如UNIX时间戳,您可以使用所有不错的gnuplot功能而无需摆弄。