通过在水平轴上选择范围来拟合图形和绘制线条

Fitting graph and draw lines by selecting ranges in horizontal axis

我正在尝试绘制图表并使用直线对其进行拟合。

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(水平比例)相交,其形状类似于 'v'。

我想消除那个 'v' 形状的交叉点,我想得到两条单独的线,一条从 0 到 80,另一条来自 100 到 220.

我怎么能得到这个?

感谢任何帮助。

提前致谢。

您可以利用 gnuplot 不绘制 infinityNaN 值(如 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)

编辑: 抱歉,这与我错过的 Sergei Izmailov 的回答基本相同。

答案:

使用特殊文件 "+",它为您的绘图提供 x 值,然后您可以使用您选择的函数对其进行采样,包括在输入超出范围时忽略输入的函数。然后你可以直接使用你的 f1(x)f2(x):

plot "+" using ():(0 <  &&  < 80 ? f1() : 1/0), \
"+" using ():(100 <  &&  < 220 ? f2() : 1/0)

使用 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](一直都是),因此第二个函数根本不可见。

但是,对于您的情况,它应该可以正常工作。