如何在gnuplot中删除“跳转”值之间的界限?

时间:2016-12-11 17:20:54

标签: gnuplot

我想画一条包含“跳跃”值的情节。

这是一个例子:当我们绘制几个周期的sin(x)图并绘制它时,会出现从右到左穿过的不切实际的线(如下图所示)。

避免这种情况的一个想法可能是使用with linespointslink),但我想在不修改原始数据文件的情况下绘制它。

我们是否有针对此问题的简单而强大的解决方案?

sample image

3 个答案:

答案 0 :(得分:2)

假设您正在绘制一个函数,也就是说,对于每个x值,只存在一个且只有一个对应的y值,实现所需的最简单方法是使用smooth unique选项。这个平滑程序将使数据在x中单调,然后绘制它。当相同x值存在多个y值时,将使用平均值。

示例:

数据文件:

0.5 0.5
1.0 1.5
1.5 0.5
0.5 0.5

没有平滑的绘图:

set xrange [0:2]
set yrange [0:2]
plot "data" w l

enter image description here

平滑:

plot "data" smooth unique

enter image description here

答案 1 :(得分:1)

编辑:如果使用此解决方案,则会丢失点数,因此我建议您改进我的答案。

这里可以应用“条件绘图”。假设我们有这样一个文件:

1 2
2 5
3 3
1 2
2 5
3 3

即。第3点和第4点之间有一个背线。

plot "tmp.dat" u 1:2

enter image description here

找出最小x值:

stats "tmp.dat" u 1:2
prev=STATS_min_x

或者找到第一个x值:

prev=system("awk 'FNR == 1 {print $1}' tmp.dat")

如果当前x值大于之前值,则绘制线条,或者如果它更小则不绘制:

plot "tmp.dat" u ($0==0? prev:($1>prev? $1:1/0), prev=$1):2 w l

enter image description here

答案 2 :(得分:1)

好吧,这不是不可能的,但以下是一个可怕的黑客。我真的建议你在休息时在数据集中添加一个空行。

$dat << EOD
1 1
2 2
3 3
1 5
2 6
3 7
1 8
2 9
3 10
EOD

plot for [i=0:3] $dat us \
   ($0==0?j=0:j=j,llx=lx,lx=$1,llx>lx?j=j+1:j=j,i==j?$1:NaN):2 w lp notit

这会将您的数据集绘制三次(通常为四次,那里有一个小错误。我想我必须初始化所有变量),计算横坐标值“跳转”的频率,并且只绘制数据点(如果此计数器{{ 1}}等于绘图计数器j

检查串行评估运算符“a,b”和三元运算符“a?b:c”的帮助