Я делаю некоторые эксперименты на SOM в рубине. После получения лучшей единицы соответствия мой вывод выглядит следующим образом: координата x, координата y и расстояние от лучшего совпаденияruby gnuplot heatmap для самоорганизующихся выходов карты
У меня есть 200 строк.
Я хочу сделать тепловую карту для этого выхода, но попадаю в проблемы с gnuplot.
кода я использую:
Gnuplot.open do |gp|
Gnuplot::Plot.new(gp) do |plot|
plot.title "heatmap"
plot.xlabel "x"
plot.ylabel "y"
plot.xrange "[0:50]"
plot.yrange "[0:50]"
plot.terminal "png"
plot.output "myheatmap.png"
plot.set "pm3d map"
plot.set "palette rgbformula -7,2,-7" # for green heatmap
plot.set "autoscale fix"
plot.cbrange "[0.0:0.036]" # range of distance
plot.cblabel "Score"
plot.unset "cbtics"
plot.data << Gnuplot::DataSet.new([x,y,dist]) do |ds|
ds.with = "image"
ds.notitle
end
end
end
х и у массив содержит целое число (для координат) и расстояние массива содержит значение с плавающей запятой.
Я уже искал здесь и на сайте gnuplot. Зеленого цвета, используемый вдохновлено здесь: Gnuplot: how to write the z values in a heatmap plot
успеха я в черчении расстояния с точками, но мне нужно больше визуального сюжет с тепловой картой.
Помощь будет оценить благодаря
редактировать: Привет Christoph, мои данные выглядит как несколько строк ниже:
24,15,1.1214532012163798e-13,
41,41,2.088613932696844e-13,
4,10,1.485599551044706e-13,
0,20,7.981851602311569e-14,
6,46,1.1231898879790176e-13,
8,24,1.2844471889344152e-13,
11,24,2.3794505905958835e-13,
3,16,0.015633285670666745,
3,46,1.238425800407315e-13,
4,20,1.2695729760609708e-13,
Я отображающих каждый столбец в соответствующий тип (INT для первого два и поплавок для последнего). x и y представляют координаты узла, а последний столбец представляет собой расстояние между входом и единицю наилучшего соответствия. Я хочу построить карту тепла (50x50) и раскрасить каждый узел в зависимости от расстояния (белый на короткое расстояние, зеленый темнее для самого большого расстояния).
Основная проблема заключается в том, что я не успел построить то, что я хочу, с помощью кода, вставленного ниже. Я предполагаю, что я не могу вставить снимок экрана, так как я не достаточно пост ..
редактировать 2: Я также стараюсь круглой колонны расстояние, не изменяется
редактировать 3: Я, наконец, превратить свой выход (3 вектора: x, y, расстояние) в регулярную сетку.
Я создал двумерный массив, заполненный 1,0:
ntab = Array.new(50) { |i| Array.new(50) { |i| 1.0 }}
то я смотрю на соответствующий индекс по х и у векторов, что указывает узел присутствует в моих векторов, и заполнить ntab узел с соответствующим значением расстояния:
(1..50).each do |xv|
(1..50).each do |yv|
resx = x.each_with_index.select { |x, idx| x == xv}
resy = y.each_with_index.select { |y, idy| y == yv}
resx.each do |row|
next if row.empty?
tmp = [yv,row[1]]
if resy.include?(tmp)
then
ntab[xv-1][yv-1] = dist[row[1]]
end
end
end
end
У меня теперь идеальная сетка (50x50), из которой я могу построить значение расстояния.Я буду редактировать свой вопрос с готовым рабочим кодом, если я нахожу :)
Спасибо Кристофа за советы о Gnuplot
Почему мое введение «привет там» исчезло? :/ –
Итак, какова ваша реальная проблема? * Что * не работает? Как выглядит ваш файл данных? Вероятно, вы просто пропускаете пустую строку между блоками равных x-значений. – Christoph
ОК. Главное, что вам нужна регулярная сетка для построения карты тепла. Существует 'dgrid3d' для создания сетки для вас, но это, скорее всего, не то, что вы хотите, поскольку оно интерполирует ваши данные до точки обычной сетки. Если ваши узлы действительно не создают сетку или не должны быть интерполированы для создания сплошной поверхности, вы можете использовать другой стиль построения, например круги – Christoph