У меня очень большой файл данных, который включает в себя множество снимков
тех же узлов в вычислительном кластере.
Я измеряю данные между каждой подключенной конечной точкой и хочу отобразить результат в тепловой карте.
Однако, поскольку в файле данных содержится так много снимков одного и того же соединения, обычный график приведет к тому, что тысячи точек данных будут наложены друг на друга, что приведет к нечитаемому изображению, поэтому я планирую использовать STATS, чтобы уменьшить информация на соединение 3 изображения с информацией мин, макс, среднее.
Я не знаю, как правильно использовать функцию plot для достижения этой цели, и документация для gnuplot предполагает только предварительно обработанные чистые (без избыточности матрицы) файлы данных, что мне не подходит.
Мне уже удалось создать массив средних данных для каждой подключенной пары (i, j) и сохранить данные в формате avg [1 + i + j * max], и он, похоже, выполняет то, что я намереваюсь сделать ,
Теперь то, что осталось бы сделать, - это нечто, похожее на
plot i:j:avg[1+i+j*max] with image
Мой текущий код (как показано ниже) использует файл данных для выбора значений x, y, а затем применяет avg [...] в отношении x, y в качестве значения z. Это приводит к тому, что многие многоярусные рисунки одного и того же значения могут быть идентифицированы по некоторым данным более толстыми, чем другие, и, вероятно, являются основной причиной того, почему мои изображения не получатся красивыми. Поэтому я пытаюсь просто повторить один раз (x, y) от 0 до n каждый и нарисовать значение z один раз для (x, y) -пары.
Я не уверен, как вручную указать команде plot, что она должна повторять x и y от 0 до n, а затем использовать 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 с помощью color_code (значение (i, j)).
Все измеренные данные очень и очень близко друг к другу (что на самом деле хорошо), поэтому не удивительно, что мы видим довольно скучное однородное изображение:
Однако, если я манипулирую цветовым диапазоном, чтобы он был очень близок к средним результатам, чтобы получить больше контраста, я начинаю видеть ужасные эффекты:
У меня есть 3 теории на то, что может вызвать это:
в настоящее время мы рисуем каждую запись о соединении (но с тем же значением). Поэтому сложение такого количества точек может привести к странному поведению (мы можем увидеть это с более толстыми значениями, у которых было больше точек данных)
квадраты по некоторым причинам перекрываются
cbrange слишком мал, чтобы правильно вычислить нужный цвет (но я сомневаюсь в этом)
Относительно 1. это то, что я хотел бы подтвердить этим вопросом.
редактирование:
на догадках я создал несколько поддельных данных, чтобы уменьшить среднее значение datarate на одном из узлов.
но результат так же далек от ожидаемого. Я сейчас совершенно сбит с толку :(
как мы видим (1,1) значение avg упало до ~ 0.5 и должно просто появиться в более светло-зеленом цвете - но что это?!
edit2:
Я подготовил несколько образцов данных, чтобы проверить, все еще ли я в здравом уме.
1 точка данных для каждой (x, y) -пары дает именно тот результат, который я ищу:
поэтому решение моей проблемы определенно возвращается к исходному вопросу.