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

时间:2015-02-07 09:45:25

标签: gnuplot

我正在尝试绘制图形并使用直线拟合它。

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'

here

我得到了如上图。

在那个情节中,人们可以看到有两条线在80处相交(水平刻度),它的形状像&#39; v&#39;。

我希望消除那个&#39; v&#39;形状交叉,我想得到两个单独的行,一个来自 0到80 ,另一个来自 100到220

我怎么能得到这个?

感谢任何帮助。

提前致谢。

3 个答案:

答案 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不会绘制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)

答案 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)