将分类状态作为阶跃函数的gnuplot时间序列

将分类状态作为阶跃函数的gnuplot时间序列,gnuplot,time-series,categorical-data,Gnuplot,Time Series,Categorical Data,我有一个数据文件,看起来像这样: 0;State a 1;State a 2;State b 3:State b 4:State a 其中第一列表示以秒为单位的时间,第二列表示特定状态 我想绘制gnuplot中随时间发生的事件。我尝试使用以下方法进行绘图: set datafile separator ";" plot 'data' using 1:2:yticlabels(2) set datafile separator ";" set offset 0.1,0.1,0.1,0.1 se

我有一个数据文件,看起来像这样:

0;State a
1;State a
2;State b
3:State b
4:State a
其中第一列表示以秒为单位的时间,第二列表示特定状态

我想绘制gnuplot中随时间发生的事件。我尝试使用以下方法进行绘图:

set datafile separator ";"
plot 'data' using 1:2:yticlabels(2)
set datafile separator ";"
set offset 0.1,0.1,0.1,0.1
set xtics 0,1
plot "< awk -F ';' -v OFS=';' '{if (!($2 in array)) { array[$2] = length(array) }; print $1,$2,array[$2]}' data.csv" using 1:3:ytic(2) w step lw 3 notitle
但是,我得到以下错误:

warning: Skipping data file with no valid points
                                       ^
x range is invalid
似乎gnuplot不会将字符串识别为分类值。结果应类似于非连续阶跃函数:

       ^
State b┼       ┌───────┐
       │       │       │
State a┼───────┘       └────
       │
       ┼───┼───┼───┼───┼───┼─>
       0   1   2   3   4   5           

gnuplot是否可以实现这种绘图?如果是,那么您将如何执行此操作?

否,gnuplot不将字符串识别为分类值。您必须在“字符串”中完成这些任务→ 整数“你自己

执行此映射的最简单方法是使用外部工具,如
awk
,并动态添加整数值。以下
awk
调用执行此映射并将值添加到输出:

awk -F ';' -v OFS=';' '{
  if (!($2 in array)) { 
    array[$2] = length(array)
  }
  print $1,$2,array[$2]
}' data.csv
使用gnuplot语法

plot "< awk ..."
输出是

或者,如果您没有访问
awk
,也可以使用类似以下
cat.py
的python脚本进行预处理:

from __future__ import print_function
import sys
a={}
with open(sys.argv[1], 'r') as f:
    for line in f:
        fields = line.strip().split(';')
        if (not fields[1] in a):
            a[fields[1]] = len(a)
        print("{0};{1};{2}".format(fields[0], fields[1], a[fields[1]]), file=sys.stdout)
并称之为

plot "< python cat.py data.csv" ...
plot“

旁注:可能也可以只使用gnuplot来实现这一点,但这可能会变得非常难看,请参阅类似的用例。

由于只有两种状态,我不会说这符合gnuplot不是数据处理工具的结论(尽管这句话通常是正确的!)

这应该符合法案:

f(s) = s eq "state a" ? 0 : s eq "state b" ? 1 : NaN
set dataf sep ";"
plot dataf using 1:(f(stringcolumn(2))) with steps # or fsteps
如果你有十几个不同的州,那就另当别论了

说明:您需要使用
stringcolumn()
函数,因为
column(2)
$2
返回一个fp编号,如果他们没有找到可以转换为数字的内容,则返回一个错误。
=
运算符仅比较数值,您必须使用
eq

a?B:C是三元运算符,如果a==0,则返回C,否则返回B。

是否有已知的状态数以及状态名称?或者这是动态的?我有不同的文件包含不同的状态。大多数情况下,它们是二进制的“开/关”或“活动/非活动”。如果有一个通用的解决方案就好了,因为名称取决于加载的文件,并且有些文件的状态更多。谢谢你的回答。gnuplot不提供此功能是否有(历史)原因。这似乎是数据探索的一项重要任务?主要原因是,gnuplot不想成为一个功能齐全的数据处理工具。它的主要焦点是绘制数据,而不是处理数据。因此,这类任务被外包给其他更合适的工具。这也是gnuplot没有数组数据结构的原因。听起来很合理,并且符合unix的原理。感谢您指出这一点。在@jdog的评论中,可以出现两个以上的状态,这让我想到了您引用的评论。这些状态在文件之间可能有所不同。