反复在曲线图/图形/画布上堆叠曲线

时间:2019-01-08 16:48:37

标签: gnuplot

带有一组数据文件。我想对每个文件执行一系列操作(例如拟合),并将结果曲线与我的分析一起连续堆叠(以查看每个曲线如何适合更大的图片)。我写了以下代码片段

reset
PATH = 'XRP_'
nmin = 1
nmax = 20

f(x) = log10(x); h(x) = a*x + b 
name(i) = sprintf(PATH.'%04d/data_main_ddnls_twod_mlce.dat', i)
set xrange [0:7]
start = 0
set fit 
do for [i=nmin:nmax]{
    fit [4:] h(x) name(i) using (f($1)):(f($4)) via a, b 
    if (start==0){
        plot name(i) using (f($1)):(f($4)) w l title sprintf("%04d", i)
    } else {
    replot name(i) using (f($1)):(f($4)) w l title sprintf("%04d", i)
}
start = start + 1
pause -1
}
# Add the slope 
replot (1./5.)*x  + 0.5 lc 'black' lw 3 dt 2
unset fit 
# pause -1

它不是堆叠所有先前的曲线和当前曲线,而是仅绘制当前曲线的i倍(请参见代码循环)。例如,经过10次迭代,它仅绘制第10个数据文件10次(请参见图片中的图例)

enter image description here

我该如何解决?

2 个答案:

答案 0 :(得分:3)

您的绘图按照其行为方式进行操作的原因以及theozh的示例(1)也是如此,是因为“ replot f(x)”通过在前面的绘图命令的末尾加上“,f(x)”来起作用。通过将其放入循环中,基本上就是在创建连续的命令

 plot f(x,i)
 plot f(x,i), f(x,i)
 plot f(x,i), f(x,i), f(x,i)
 ...

是的,i的值可能每次都会更改,但是尽管如此,每个plot命令都会生成同一事物的多个副本。

替代解决方案:我通常不建议使用多图模式来创建单个输出,但是在这种情况下,它可能是最佳选择。

# force identical margins even if the range changes
set margins screen 0.1, screen 0.9, screen 0.1, screen 0.9

# ... same prelimary stuff as shown in the question

# revised loop using multiplot rather than replot
set multiplot
do for [i=nmin:nmax]{
    fit [4:] h(x) name(i) using (f($1)):(f($4)) via a, b 
    plot name(i) using (f($1)):(f($4)) w l \
        title sprintf("%04d", i) at screen 0.9, screen 1.0 - 0.02*i
    unset tics
}
unset multiplot

请注意,您不能使用自动生成的标题放置位置,因为每次多次绘图都会将标题放置在同一位置。因此,我们改为使用“ title foo at”的形式。同样,最好在第一遍之后关闭tic生成,这样您就不必在每次循环时都重新绘制tic和标签。

答案 1 :(得分:0)

确实,这是我也不会想到的奇怪行为。请参阅下面的最小示例。

  • 版本1:基本上是您的尝试。不是预期的结果。我也不知道 为什么。
  • 版本2:预期结果。基本相同,但不是循环的。
  • 版本3:预期结果,虽然是循环的,但使用eval

不太令人满意,但至少有一些解决方案。希望其他人会有更好的解决方案或解释。

### plotting in a loop
reset session
set colorsequence classic

# Version 1
set title "Version 1"
do for [i=1:5] {
    if (i==1) { plot x**i }
    else { replot x**i noautoscale }
}
pause -1

# Version 2
set title "Version 2"
plot x**1
replot x**2 noautoscale
replot x**3 noautoscale
replot x**4 noautoscale
replot x**5 noautoscale
pause -1

# Version 3
set title "Version 3"
do for [i=1:5] {
    if (i==1) { cmd = sprintf("plot x**%d",i) }
    else { cmd = sprintf("replot x**%d noautoscale",i) }
    eval cmd
}
### end of code

enter image description here