从两点继续通过点的简单线

Simple line from two points continuing through points

我只是想从两点画一条二维线,但要让线在两点之外继续。如果我想要一条线段以这些点结束,但我希望该线继续延伸到边缘,则以下代码有效。这是我在点

处结束的内容
data:
 x  y
 0  4
 1 -1 

reset
set terminal svg enhanced fname 'Times New Roman' rounded dashed standalone
set size ratio 1.0
set xrange[-2:3]
set yrange[-2:6]
set style line 1 \
    linecolor rgb '#0060ad' \
    linetype 1 linewidth 2 \
    pointtype 7 pointsize 1.0
plot data with lp ls 1 

我希望它继续通过,越过定义点到达边缘。

有很多方法可以从作为输入数据提供的两个点获得线性函数f(x) = a+b*x,这里有三种不同的方法。

从数据块读取 (x1,y1,x2,y2)

可以将坐标设置为数据块,并使用元素显式计算 ab。不幸的是,在 gnuplot 中索引数据块有点麻烦,因此函数定义变得相当冗长:

$DATA << EOD
0.0   4.0
1.0  -1.0 
EOD

a(x1,y1,x2,y2) = (y1*x2 - y2*x1) / (x2 - x1)
b(x1,y1,x2,y2) = (y2 - y1) / (x2 - x1)

f(x) = a(word($DATA[1],1), word($DATA[1],2), word($DATA[2],1), word($DATA[2],2)) + \
       b(word($DATA[1],1), word($DATA[1],2), word($DATA[2],1), word($DATA[2],2)) * x

plot $DATA, f(x)

说明:$DATA[1] 给出完整的第一行,word 使用空格作为分隔符选择第一个或第二个元素。 如果您的数据点应该从文件 mydata.dat 中读取,则将第一个代码块更改为:

set table $DATA
plot 'mydata.dat' with table
unset table

旁注:将数字写成 1.0 而不是 1 可以规避整数计算的陷阱。

从数组中读取 (x1,y1,x2,y2)

如果 x 和 y 值在两个单独的数组中提供,索引变得更容易,并且可以缩短函数定义:

array xvals[2] = [0.0, 1.0]
array yvals[2] = [4.0, -1.0]

a(x1,y1,x2,y2) = (y1*x2 - y2*x1) / (x2 - x1)
b(x1,y1,x2,y2) = (y2 - y1) / (x2 - x1)

f(x) = a(xvals[1], yvals[1], xvals[2], yvals[2]) + \
       b(xvals[1], yvals[1], xvals[2], yvals[2]) * x

plot xvals u 2:(yvals[[=12=]+1]) w lp ls 1, f(x)

或者,再次从文件中读取:

array xvals[2]
array yvals[2]
do for [i=1:2] {
  stats 'mydata.dat' every ::i-1::i-1 using (xvals[i]=,yvals[i]=) noout
}

使(琐碎的)适合

可以执行(严格来说是非线性的)拟合——当然,gnuplot 会抱怨错误变为零:

f(x) = a + b*x
fit f(x) $DATA via a,b
# fit f(x) 'mydata.dat' via a,b
plot $DATA w lp ls 1, f(x)

编辑:第 4 个变体使用 stats

默认情况下,stats 命令对输入的任何数据集执行线性拟合,并创建一堆 STATS_* 变量:

stats 'mydata.dat' nooutput
a = STATS_intercept
b = STATS_slope
f(x) = a + b*x
plot 'mydata.dat', f(x)