Gnuplot 如何手动迭代绘图的x和y值,并将x和y索引应用于热图函数?

Gnuplot 如何手动迭代绘图的x和y值,并将x和y索引应用于热图函数?,gnuplot,Gnuplot,我有一个非常大的数据文件,其中包括许多快照 计算集群中相同节点的。 我正在测量每个连接端点之间的数据速率,并希望在热图中显示结果 然而,由于数据文件中有太多相同连接的快照,一个普通的绘图将导致数千个数据点相互叠加,这将产生一个无法读取的图像-因此我计划使用统计信息将每个连接的信息减少到3个图像,信息为min、max、mean 我不知道如何正确使用plot函数来实现这一点,gnuplot的文档仅假设预处理的干净(非冗余矩阵)数据文件,这对我来说不是一个选项 我已经为每个连接对(I,j)生成了一个平

我有一个非常大的数据文件,其中包括许多快照 计算集群中相同节点的。 我正在测量每个连接端点之间的数据速率,并希望在热图中显示结果

然而,由于数据文件中有太多相同连接的快照,一个普通的绘图将导致数千个数据点相互叠加,这将产生一个无法读取的图像-因此我计划使用统计信息将每个连接的信息减少到3个图像,信息为min、max、mean

我不知道如何正确使用plot函数来实现这一点,gnuplot的文档仅假设预处理的干净(非冗余矩阵)数据文件,这对我来说不是一个选项

我已经为每个连接对(I,j)生成了一个平均数据速率数组,并将数据存储在avg[1+I+j*max]中,它似乎完成了我想要它做的事情

现在剩下要做的是类似于

plot i:j:avg[1+i+j*max] with image
我当前的代码(如下所示)使用数据文件来计算x,y值,然后将x,y的平均值[…]作为z值。这导致了许多相同值的堆叠图形,其中一些数据比其他数据更胖,这可能是我的图像效果不佳的根本原因。因此,我尝试从0到n在(x,y)上迭代一次,并在每个(x,y)-对上绘制一次z值

我不知道如何手动告诉plot命令它应该从0到n迭代x和y,然后使用avg[…]作为z值来绘制图像

当前的gnuplot被截断

# Color runs from white to green
set palette rgbformula -7,2,-7
set cblabel "Score"
unset cbtics
stats 'NxN_10GB.dat' using (column(10)) nooutput
set cbrange [STATS_min:STATS_max]

set output 'heatmap.png'
set title 'heatmap'
set xlabel 'en_id'
set ylabel 'pn_id'
set xrange [-1:10]
set yrange [-1:10]
set xtics 1
set ytics 1

stats 'NxN_10GB.dat' using (column(1)) nooutput
max_en = STATS_max
num_en = max_en + 1
stats 'NxN_10GB.dat' using (column(2)) nooutput
max_pn = STATS_max
num_pn = max_pn + 1
print sprintf("num_en = %d", num_en)
print sprintf("num_pn = %d", num_pn)


array Avg[num_en * num_pn]
ind(a,b) = 1+a+b*num_pn
getavg(a,b) = Avg[ind(a,b)]
do for [i=0:max_en] {
    do for [j=0:max_pn] {
    index = ind(i,j)
    stats 'NxN_10GB.dat' using ($1 == i && $2 == j && $3 == 10 ? column(10) : 1/0) nooutput
    print sprintf("index = %d",index)
    Avg[index] = STATS_mean
    print sprintf("Avg[%2d,%2d] = %f",i,j,Avg[index])
    }
}

plot 'NxN_10GB.dat' using 1:2:(Avg[1+$1+$2*num_pn]) with image , \
     'NxN_10GB.dat' using 1:2:(sprintf("%g",Avg[1+$1+$2*num_pn])) with labels

这是一个截取的数据,大约有360个快照/连接对($1,$2)。我现在只对第1、2和10列感兴趣

en_id pn_id #en #pn time(sec) completions msg_size byte total_data(Gb) datarate(Gb/s)
0 0 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 1 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 2 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 3 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 4 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 5 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 6 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 7 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 8 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
0 9 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 0 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 1 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 2 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 3 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 4 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 5 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 6 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 7 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 8 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
1 9 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
2 0 10 10 10.0002 531 5048576 2680793856 21.4464 2.14459
2 1 10 10 10.0002 531 5048576 2680793856 21.4464 2.14459
2 2 10 10 10.0002 531 5048576 2680793856 21.4464 2.14459
3 3 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
3 4 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
3 5 10 10 10.0002 532 5048576 2685842432 21.4867 2.14863
因此,标准热图应使用颜色代码(值(i,j))为索引i,j处的正方形着色

所有测量的数据速率都非常接近(这实际上是一件好事),因此毫不奇怪,我们看到了一个相当乏味的统一图像:

但是,如果我操纵颜色范围使其非常接近平均结果以获得更多对比度,我会开始看到可怕的效果:

我有三种理论来解释是什么导致了这种情况:

  • 目前,我们绘制每个连接条目(但是具有相同的值)。所以叠加如此多的点可能会导致奇怪的行为(我们可以看到,脂肪值越多,数据点越多)

  • 由于某种原因,正方形重叠

  • cbrange太小,无法正确计算正确的颜色(但我对此表示怀疑)

  • 关于1。这就是我想用这个问题来证实的

    编辑:

    凭直觉,我生成了一些虚假数据,以降低其中一个节点上的平均数据速率。 但结果与预期相差甚远。我现在完全糊涂了:(

    正如我们所看到的(1,1),平均值下降到~0.5,应该只是以更浅的绿色显示-但这是什么

    编辑2:

    我提供了一些样本数据,看看我是否仍然神智正常。 每个(x,y)-对1个数据点产生我想要的结果:


    因此,解决我的问题肯定会回到原来的问题。

    您可以使用
    ++
    特殊文件名创建(x,y)的列表点,然后您可以使用这些点为数组编制索引。请参阅
    帮助+
    ,了解如何使用
    设置urange
    设置采样数
    ,等等来设置这些点的间距。请记住,这些坐标是浮点,因此如果要将它们用作数组索引,必须将它们四舍五入到最接近的整数

    这样的东西可能适合你:

    reset
    
    set palette rgbformula -7,2,-7
    1set cblabel "Score"
    unset cbtics
    stats 'NxN_10GB.dat' using (column(10)) nooutput
    set cbrange [STATS_min:STATS_max]
    
    #set output 'heatmap.png'
    set title 'heatmap'
    set xlabel 'en_id'
    set ylabel 'pn_id'
    set xtics 1
    set ytics 1
    
    stats 'NxN_10GB.dat' using (column(1)) nooutput
    max_en = STATS_max
    num_en = max_en + 1
    stats 'NxN_10GB.dat' using (column(2)) nooutput
    max_pn = STATS_max
    num_pn = max_pn + 1
    print sprintf("num_en = %d", num_en)
    print sprintf("num_pn = %d", num_pn)
    
    array Avg[num_en * num_pn]
    ind(a,b) = 1+a+b*num_pn
    getavg(a,b) = Avg[ind(a,b)]
    do for [i=0:max_en] {
        do for [j=0:max_pn] {
        index = ind(i,j)
        stats 'NxN_10GB.dat' using ($1 == i && $2 == j && $3 == 10 ? column(10) : 1/0) nooutput
        print sprintf("index = %d",index)
        Avg[index] = STATS_mean
        print sprintf("Avg[%2d,%2d] = %f",i,j,Avg[index])
        }
    }
    
    set urange [0:num_en-1]
    set vrange[0:num_pn-1]
    set samples num_en
    set isosamples num_pn
    plot "++" using 1:2:(Avg[1+int($1+0.5)+int($2+0.5)*num_pn]) w image, \
         "++" using 1:2:(sprintf("%g",Avg[1+int($1+0.5)+int($2+0.5)*num_pn])) with labels
    
    我实现(我猜)你想要什么的方法如下:

    不要对过滤后的数据执行
    stats
    NxN
    次,只传递一次数据,然后通过提取最小值、最大值、总和和计数的值并将其放入数组来进行统计。如果其中一个连接没有数据,这种方法也可以容忍(见下图中的白色方框)

    绘制热图是一种方法。 您还可以使用带有boxyError的
    创建“热图外观”绘图。
    另一个绘制数据的建议是,使用耶罗棒绘制数据,并显示与平均值的偏差。这样,在同一个绘图中,可能更容易显示最小值和最大值

    守则:

    ### statistics: minimum, maximum, average
    reset session
    set size square
    set key left
    
    FILE = "NxN_10GB.dat"  # skip random generation section and replace $Data with FILE
    
    # generate some random data
    M = 10
    N = 10
    set print $Data
    do for [i=1:500] {
        print sprintf("%d %d 0 0 0 0 0 0 0 %g",int(rand(0)*N),int(rand(0)*M),rand(0)/100.+2.14)
    }
    set print
    
    # get the size of the array
    stats $Data u 1:2 nooutput
    M = int(STATS_max_y+1)
    N = int(STATS_max_x+1)
    ConnectionsCount = M*N
    
    # initialize arrays
    array Min[ConnectionsCount]   
    array Max[ConnectionsCount]   
    array Sum[ConnectionsCount]
    array Count[ConnectionsCount]
    do for [i=1:ConnectionsCount] {
        Min[i] = NaN; Max[i] = NaN; Sum[i] = 0; Count[i] = 0
    }
    
    IndexNo(m,n) = m*N + n +1
    set table $Dummy
        plot $Data u \
            (a=Min[IndexNo($1,$2)], Min[IndexNo($1,$2)] = ($10>=a && (a==a)) ? a : $10, \
             b=Max[IndexNo($1,$2)], Max[IndexNo($1,$2)] = ($10<=b && (b==b)) ? b : $10, \
             Sum[IndexNo($1,$2)] = Sum[IndexNo($1,$2)] + $10, \
             Count[IndexNo($1,$2)] = Count[IndexNo($1,$2)]+1 ) with table
    unset table
    
    set xrange[-0.5:N-0.5]
    set xtics out
    set yrange[-0.5:M-0.5]
    set ytics out
    
    SumTotal = sum[i=1:ConnectionsCount] (Sum[i])
    CountTotal = sum[i=1:ConnectionsCount] (Count[i])
    AverageTotal = SumTotal/CountTotal
    print AverageTotal
    
    set samples ConnectionsCount  # number of samples for '+'
    set multiplot layout 2,1
        plot '+' u (int($0)%N):(int($0/N)):(0.5):(0.5):(Sum[$0+1]/Count[$0+1]) w boxxyerror lc palette fs solid 1.0 not
    
        set title sprintf("Deviation of average from total average %g",AverageTotal)    
        set size nosquare
        set xlabel "Number of connection"
        set xrange[0:ConnectionsCount+1]
        set yrange[*:*]
        plot '+' u ($0+1):(Sum[$0+1]/Count[$0+1]-AverageTotal):(Min[$0+1]-AverageTotal):(Max[$0+1]-AverageTotal) \
            with yerr pt 7 lc rgb "red" notitle
    unset multiplot
    ### end of code
    
    ###统计:最小值、最大值、平均值
    重置会话
    定格
    向左键
    FILE=“NxN_10GB.dat”#跳过随机生成部分并用FILE替换$Data
    #生成一些随机数据
    M=10
    N=10
    设置打印$Data
    do for[i=1:500]{
    打印sprintf(“%d%d00%g”),整数(兰特(0)*N),整数(兰特(0)*M),兰特(0)/100.+2.14)
    }
    套印
    #获取数组的大小
    统计$Data u 1:2无输出
    M=int(统计数据最大值y+1)
    N=int(统计数据最大值x+1)
    ConnectionsCount=M*N
    #初始化数组
    数组最小值[连接计数]
    数组最大值[连接计数]
    数组和[连接计数]
    数组计数[连接计数]
    do for[i=1:连接计数]{
    最小[i]=NaN;最大[i]=NaN;和[i]=0;计数[i]=0
    }
    指数No(m,n)=m*n+n+1
    设置表$Dummy
    绘图$Data u\
    (a=Min[IndexNo($1,$2)],Min[IndexNo($1,$2)]=($10>=a&&(a==a))?a:$10\
    b=最大[指数编号($1,$2)],最大[指数编号($1,$2)]=(10美元)