如何删除“之间的行”;“跳跃”;值,在gnuplot中?

如何删除“之间的行”;“跳跃”;值,在gnuplot中?,gnuplot,Gnuplot,我想用包含“跳跃”值的图来画一条线 下面是一个例子:当我们有几个周期的sin(x)图并绘制它时,会出现从右到左的不现实线(如下图所示) 避免这种情况的一个方法可能是使用和linespoints(),但我希望在不修改原始数据文件的情况下绘制它 对于这个问题,我们有简单而健壮的解决方案吗 编辑:如果使用此解决方案,分数将丢失,因此我建议改进我的答案 这里可以应用“条件绘图”。假设我们有这样一个文件: 1 2 2 5 3 3 1 2 2 5 3 3 i、 e.在第三点和第四点之间有一条底线 plot

我想用包含“跳跃”值的图来画一条线

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

避免这种情况的一个方法可能是使用
和linespoints
(),但我希望在不修改原始数据文件的情况下绘制它

对于这个问题,我们有简单而健壮的解决方案吗


编辑:如果使用此解决方案,分数将丢失,因此我建议改进我的答案

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

1 2
2 5
3 3
1 2
2 5
3 3
i、 e.在第三点和第四点之间有一条底线

plot "tmp.dat" u 1:2

查找最小x值:

stats "tmp.dat" u 1:2
prev=STATS_min_x
或查找第一个x值:

prev=system("awk 'FNR == 1 {print $1}' tmp.dat")
如果当前x值大于上一个x值,则绘制该线;如果当前x值小于上一个x值,则不绘制该线:

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

编辑:如果使用此解决方案,分数将丢失,因此我建议改进我的答案

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

1 2
2 5
3 3
1 2
2 5
3 3
i、 e.在第三点和第四点之间有一条底线

plot "tmp.dat" u 1:2

查找最小x值:

stats "tmp.dat" u 1:2
prev=STATS_min_x
或查找第一个x值:

prev=system("awk 'FNR == 1 {print $1}' tmp.dat")
如果当前x值大于上一个x值,则绘制该线;如果当前x值小于上一个x值,则不绘制该线:

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

好的,这不是不可能的,但下面是一个可怕的黑客。我真的建议您在数据集中的断点处添加一个空行

$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
$dat lx?j=j+1:j=j,i==j?$1:NaN):2 w lp notit
这会将数据集打印三次(最多四次,其中有一个小错误。我想我必须初始化所有变量),计算横坐标值“跳跃”的频率,并且仅当此计数器
j
等于打印计数器
I
时才打印数据点


查看序列求值运算符“a,b”和三元运算符“a?b:c”的帮助。好的,这不是不可能的,但下面是一个可怕的攻击。我真的建议您在数据集中的断点处添加一个空行

$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
$dat lx?j=j+1:j=j,i==j?$1:NaN):2 w lp notit
这会将数据集打印三次(最多四次,其中有一个小错误。我想我必须初始化所有变量),计算横坐标值“跳跃”的频率,并且仅当此计数器
j
等于打印计数器
I
时才打印数据点


查看串行求值运算符“a,b”和三元运算符“a?b:c”的帮助信息假定您正在绘制一个函数,也就是说,每个x值都存在一个且只有一个对应的y值,实现所需的最简单方法是使用
平滑唯一
选项。此平滑例程将使数据在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
plot "data" smooth unique

使用平滑:

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

假设您正在绘制一个函数,即每个x值都存在一个且只有一个对应的y值,实现所需的最简单方法是使用
平滑唯一
选项。此平滑例程将使数据在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
plot "data" smooth unique

使用平滑:

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

只需在数据文件中横坐标值跳转的地方放一条空行即可。@Karl感谢您的评论。但是,正如我在问题中所写的,我希望在不修改原始文件的情况下实现它。我没有看到:“with linespoint”与“with lines”相同,只是添加了点区域。否则:不可能。只需在数据文件中横坐标值跳跃的点处放置一条空行即可。@Karl感谢您的评论。但正如我在问题中所写的,我希望在不修改原始文件的情况下实现它。我没有看到:“with linespoint”与“with lines”相同,只是添加了点区域。否则:不可能。@Karl是的,我现在看到了。@Karl是的,我现在看到了。这绝对是一个漂亮的解决方案!您的方法简单/可靠且功能强大。谢谢你的精彩解决方案!这是绝对漂亮的解决方案!您的方法简单/可靠且功能强大。谢谢你的精彩解决方案!