1

我正在用红宝石做一些关于 SOM 的实验。获得最佳匹配单元后,我的输出如下所示:x 坐标、y 坐标和与最佳匹配单元的距离

我有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

x 和 y 数组包含整数(用于坐标),dist 数组包含浮点值。

我已经在这里和 gnuplot 网站上搜索过。使用的绿色灵感来自这里: Gnuplot: how to write the z values in a heatmap plot

我成功地用点绘制距离,但我需要更多带有热图的视觉图。

帮助将不胜感激

编辑:嗨克里斯托夫,我的数据看起来像下面的几行:

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,最后一个为float)。x 和 y 表示节点坐标,最后一列表示输入和最佳匹配单元之间的距离。我想绘制一个热图(50x50)并根据距离为每个节点着色(白色表示短距离,绿色深表示最大距离)。

主要问题是我没有成功用下面粘贴的代码绘制我想要的东西。我想我不能粘贴屏幕截图,因为我没有足够的帖子..

编辑 2:我也尝试对距离列进行舍入,没有变化

编辑 3:我终于将我的输出(3 个向量:x、y、距离)转换为常规网格。

我创建了一个用 1.0 填充的二维数组:

ntab = Array.new(50) { |i| Array.new(50) { |i| 1.0 }}

然后我在 x 和 y 向量中查找相应的索引,这表明节点存在于我的向量中,并用相应的距离值填充 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),我可以从中绘制距离值。如果我找到它,我会用最终的工作代码编辑我的问题:)

感谢 Christoph 提供有关 gnuplot 的建议

4

1 回答 1

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   

结果

于 2015-11-22T20:31:01.893 回答