我正在尝试绘制图形并使用直线拟合它。
f1(x)=a1+b1*x
fit [0:80] f1(x) 'diff-xy-bcmLyo25perS.dat' via a1,b1
f2(x)=a2+b2*x
fit [100:220] f2(x) 'diff-xy-bcmLyo25perS.dat' via a2,b2
我尝试使用命令将两个图绘制到同一图表中:
f(x) = x < 60 ? f1(x) : f2(x)
plot 'diff-xy-bcmLyo25perS.dat' using 1:2 with lines linestyle 1 title "{/Symbol b}BCMal-C_{12}C_{8}", f(x) lw 3.0 lc rgb 'black'
我得到了如上图。
在那个情节中,人们可以看到有两条线在80处相交(水平刻度),它的形状像&#39; v&#39;。
我希望消除那个&#39; v&#39;形状交叉,我想得到两个单独的行,一个来自 0到80 ,另一个来自 100到220 。
我怎么能得到这个?
感谢任何帮助。
提前致谢。
答案 0 :(得分:3)
使用gnuplot 5.0,您可以为不同的功能指定不同的范围:
set style data lines
plot 'diff-xy-bcmLyo25perS.dat' using 1:2 ls 1, \
[0:80] f1(x) lw 3.0 lc rgb 'black',\
[100:220] f2(x) lw 3.0 lc rgb 'black'
请注意,这仅适用,因为您首先绘制数据文件。仅绘图
plot [0:80] f1(x), [100:220] f2(x)
不会起作用,因为第一个范围设置相当于全局set xrange [0:80]
(它一直是),所以第二个函数根本不可见。
但是,在你的情况下它应该可以正常工作。
答案 1 :(得分:2)
您可以利用该gnuplot不会绘制infinity
和NaN
值(1.0/0
)
使用
plot_if_in_range(y,x,lower,upper) = (x>=lower && x<=upper)?(y):(1.0/0)
您可以轻松地在给定域中绘制任何函数:
plot plot_if_in_range(exp(x) , x, -5, 2), \
plot_if_in_range(sin(x)+x, x, -2, 5)
答案 2 :(得分:2)
修改强> 对不起,这与Sergei Izmailov的答案基本相同,我错过了。
<强>答案:强>
使用特殊文件"+"
,它为您的绘图提供x值,然后您可以使用您选择的函数进行采样,包括忽略输入的值,如果它超出范围。然后,您可以直接使用f1(x)
和f2(x)
:
plot "+" using ($1):(0 < $1 && $1 < 80 ? f1($1) : 1/0), \
"+" using ($1):(100 < $1 && $1 < 220 ? f2($1) : 1/0)