从两点继续通过点的简单线
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)
可以将坐标设置为数据块,并使用元素显式计算 a
和 b
。不幸的是,在 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)
我只是想从两点画一条二维线,但要让线在两点之外继续。如果我想要一条线段以这些点结束,但我希望该线继续延伸到边缘,则以下代码有效。这是我在点
处结束的内容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)
可以将坐标设置为数据块,并使用元素显式计算 a
和 b
。不幸的是,在 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)