我有一个数据文件,其中矩阵分为不同的 gnuplot 索引。我想做一个随时间演变的密度图的动画(=索引)。
问题是我想保持 cbrange 的最大值和最小值对称,同时允许它随时间变化。
在下面的代码中,第一个“stats”命令只是给出循环的块数。带有前缀“B”的第二个“stats”命令应该为我提供每个索引处矩阵的最大值和最小值,这样我就可以正确设置 cbrange。
代码第一次进入循环时它可以工作(对于 i=1),并且 stats 给了我正确的数字。从第二个循环开始(i = 2)统计给我错误的数字......
我尝试在 stats 命令之前将
cbrange
和 zrange
设置为 [*:*]
,但没有帮助。
这是代码:
set terminal gif animate delay 0.5
set output 'foobar.gif'
stats 'dat-rw2d.dat' nooutput
set pm3d map
set palette defined (-1 "blue", 0 "white", 1 "red")
print STATS_blocks
do for [i=1:int(STATS_blocks)] {
print i
stats "dat-rw2d.dat" index (i-1) matrix nooutput prefix "B"
max = (B_max > -B_min)?(B_max):(-B_min)
set cbrange [-max:max]
print B_max, B_min
splot 'dat-rw2d.dat' matrix index (i-1)
}
如果我不绘制任何内容(下面的代码),统计数据会给我正确的数字。所以实际上是“斑点”引起了问题。它正在修复一些规模并妨碍统计吗?在统计数据之前我已经尝试过
set cbrange [*:*]
,但它并不能解决问题。
do for [i=1:int(STATS_blocks)] {
print i
stats "dat-rw2d.dat" index (i-1) matrix nooutput prefix "B"
max = (B_max > -B_min)?(B_max):(-B_min)
set cbrange [-max:max]
print B_max, B_min
}
如果您没有指定任何用于
stats
的列,gnuplot 会尝试猜测合适的默认列。使用 matrix
选项,这似乎是一个错误的选项(可能是 x 值或 y 值,或矩阵大小),它不会因块而异。
您必须告诉 gnuplot 明确使用第三列作为
stats
:
stats 'dat-rw2d.dat' nooutput
set pm3d map
set palette defined (-1 "blue", 0 "white", 1 "red")
print STATS_blocks
do for [i=1:int(STATS_blocks)] {
print i
stats "dat-rw2d.dat" using 3 index (i-1) matrix nooutput prefix "B"
max = (B_max > -B_min)?(B_max):(-B_min)
set cbrange [-max:max]
print B_max, B_min
splot 'dat-rw2d.dat' matrix index (i-1)
}
因为它看起来像一个错误,我只能提出一个解决方法(可怕的恕我直言),但这就是我的想法:
在
gnuplot
命令中调用 system
,将变量保存在文件 dummy.txt
中并从脚本加载该文件。
stats 'test.txt' nooutput
do for [cntr=1:int(STATS_blocks)] {
# next line doesn't work
# stats 'test.txt' index (cntr-1) matrix prefix "B"
# next 3 lines do the hack
cmd=sprintf('gnuplot -e "stats \"test.txt\" index %d matrix nooutput prefix \"B\"; save var \"dummy.txt\""',cntr-1)
system(cmd)
load("dummy.txt")
print cntr, B_max, B_min
max = (B_max > -B_min)?(B_max):(-B_min)
set cbrange [-max:max]
splot 'test.txt' matrix index (cntr-1) w l
}
如果有人愿意重现该问题,这是我的
test.txt
文件:
0 0
0 1
1 1
1 2
2 2
3 3
在我的脚本中,当读取的所有值都在
stats
之外时,yrange
会失败,但当我设置 yrange
来适应所有数据点时,它会起作用。