我有一个文件如下:
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自动调整时间,我的图表如下所示:
我想根据文件中的顺序制作图表,任何帮助都会很棒=)
答案 0 :(得分:0)
当你给出情节命令时
plot datafile u 1:2
你告诉gnuplot第一列是你的x值,第二列是你的y值。当然,较早的时间是在左侧(因为您没有发布完整的数据,我只使用了您发布的部分 - 这将导致轴标签中的“跳过”)。
您可以使用伪列将行号用作x值。 0 列对应于行号(请参阅help pseudocolumns
)。
因此plot datafile u 0:2
将使用行号作为x坐标,将第2列作为y坐标。
我们仍然需要添加正确的x轴标签,在这种情况下不能依赖它们正确生成。我们将使用xtic
函数来执行此操作,因为 1
plot datafile u 0:2:xtic(1)
告诉gnuplot将第1列中的值用作xtic,但它会按字面意思读取,而不是按照您所希望的时间格式化它。为此,我们可以手动将其转换为正确的字符串
plot datafile u 0:2:xtic(strftime("%H:%M",strptime("%H:%M:%S",strcol(1)))) w lines
这里,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
<小时/> 1 请注意,这也会导致标签重叠,因为它会使用所有标签。要使用其他每一个,我们可以使用
xtic(int($0) % 2 == 0 ? strcol(1):"")
。类似的技术也可以使用正确的标签格式。
答案 1 :(得分:0)
正确的解决方案是使用完整日期和时间或时间戳保存数据。
使用$0
并使用xticlabel
标记xtics的所有其他解决方案要求您的数据等距离为空格,但似乎并非如此。
因此,只需将您的数据另存为例如UNIX时间戳,您可以使用所有不错的gnuplot功能而无需摆弄。