Gnuplot 如何手动迭代绘图的x和y值,并将x和y索引应用于热图函数?
我有一个非常大的数据文件,其中包括许多快照 计算集群中相同节点的。 我正在测量每个连接端点之间的数据速率,并希望在热图中显示结果 然而,由于数据文件中有太多相同连接的快照,一个普通的绘图将导致数千个数据点相互叠加,这将产生一个无法读取的图像-因此我计划使用统计信息将每个连接的信息减少到3个图像,信息为min、max、mean 我不知道如何正确使用plot函数来实现这一点,gnuplot的文档仅假设预处理的干净(非冗余矩阵)数据文件,这对我来说不是一个选项 我已经为每个连接对(I,j)生成了一个平均数据速率数组,并将数据存储在avg[1+I+j*max]中,它似乎完成了我想要它做的事情 现在剩下要做的是类似于Gnuplot 如何手动迭代绘图的x和y值,并将x和y索引应用于热图函数?,gnuplot,Gnuplot,我有一个非常大的数据文件,其中包括许多快照 计算集群中相同节点的。 我正在测量每个连接端点之间的数据速率,并希望在热图中显示结果 然而,由于数据文件中有太多相同连接的快照,一个普通的绘图将导致数千个数据点相互叠加,这将产生一个无法读取的图像-因此我计划使用统计信息将每个连接的信息减少到3个图像,信息为min、max、mean 我不知道如何正确使用plot函数来实现这一点,gnuplot的文档仅假设预处理的干净(非冗余矩阵)数据文件,这对我来说不是一个选项 我已经为每个连接对(I,j)生成了一个平
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处的正方形着色
所有测量的数据速率都非常接近(这实际上是一件好事),因此毫不奇怪,我们看到了一个相当乏味的统一图像:
但是,如果我操纵颜色范围使其非常接近平均结果以获得更多对比度,我会开始看到可怕的效果:
我有三种理论来解释是什么导致了这种情况:
因此,解决我的问题肯定会回到原来的问题。您可以使用
++
特殊文件名创建(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美元)