GNUPLOT:统计数据在循环中给出错误的结果

问题描述 投票:0回答:3

我有一个数据文件,其中矩阵分为不同的 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
}
gnuplot
3个回答
3
投票

如果您没有指定任何用于

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)
}

0
投票

因为它看起来像一个错误,我只能提出一个解决方法(可怕的恕我直言),但这就是我的想法:

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 

0
投票

在我的脚本中,当读取的所有值都在

stats
之外时,
yrange
会失败,但当我设置
yrange
来适应所有数据点时,它会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.