2015-02-21 3 views
1

Я делаю некоторые эксперименты на 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

+0

Почему мое введение «привет там» исчезло? :/ –

+0

Итак, какова ваша реальная проблема? * Что * не работает? Как выглядит ваш файл данных? Вероятно, вы просто пропускаете пустую строку между блоками равных x-значений. – Christoph

+0

ОК. Главное, что вам нужна регулярная сетка для построения карты тепла. Существует 'dgrid3d' для создания сетки для вас, но это, скорее всего, не то, что вы хотите, поскольку оно интерполирует ваши данные до точки обычной сетки. Если ваши узлы действительно не создают сетку или не должны быть интерполированы для создания сплошной поверхности, вы можете использовать другой стиль построения, например круги – Christoph

ответ

0

В результате я, наконец, не совсем то, что я хочу, но это сделать трюк для анализа кластеров SOM

массив узел заполнения с максимальным значением расстояния, а затем построить на код ниже (я не ставил ссылку, потому что мне нужно также 10 репутации точек на публикацию более 2 ссылки: /)

Gnuplot.open do |gp| 
    Gnuplot::SPlot.new(gp) do |plot| 
    plot.pm3d 
    plot.hidden3d 
    plot.palette 'defined ( 0 "black", 51 "blue", 102 "green", 153 "yellow", 204 "red", 255 "white")' 
    plot.data << Gnuplot::DataSet.new(ntab) do |ds| 
     ds.with = 'lines' 
     ds.matrix = true 
    end 
    end 
end 

Result

Смежные вопросы