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 次(参见图片上的图例)
我怎样才能解决这个问题?
解决方案
您的绘图的行为方式以及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 的值可能每次都会改变,但是每个绘图命令都会产生同一事物的多个副本。
替代解决方案:我通常不推荐使用多图模式来创建单个输出,但在这种情况下,它可能是最佳选择。
# 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 和标签。
推荐阅读
- javascript - frappe-gantt 在我的 Angular 10 应用程序中不起作用
- c - 复制字符串中的第一个字母更改为@
- typescript - 打字稿字符串拆分删除引号
- android-source - 如何制作指定JDK版本的AOSP模块?
- javascript - ReactJS 和 Redux - TypeError:state.reduxCart 不可迭代
- java - Young GC发生时,ext root扫描需要很长时间。可能的原因是什么?
- javascript - 你好,我的目标是,当我点击“创建复选框”按钮时,它会自动创建一个带有 ID 的复选框,而不使用输入类型文本
- jquery - 使用动画的 jQuery 滚动到 div 在 safari 中无法正常工作
- android - 如何通过特定端口路由我的 android 应用程序的互联网数据?
- android - 类在firebase消息颤动上找不到异常