用于自组织映射输出的ruby gnuplot热图

用于自组织映射输出的ruby gnuplot热图,ruby,gnuplot,heatmap,som,Ruby,Gnuplot,Heatmap,Som,我正在ruby中的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:

我正在ruby中的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
我将每个列映射到适当的类型(前两个为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的建议

我最终得到的结果并不是我真正想要的,但它可以分析SOM集群

用距离的最大值填充节点数组,然后用下面的代码绘制(我没有放置链接,因为我还需要10个信誉点才能发布2个以上的链接:/)

Gnuplot.open do|gp|
Gnuplot::SPlot.new(gp)do | plot|
plot.pm3d
plot.hidden3d
plot.palette'已定义(0“黑色”,51“蓝色”,102“绿色”,153“黄色”,204“红色”,255“白色”)'

plot.data为什么我的“你好”介绍消失了/那么你的实际问题是什么?什么不起作用?您的数据文件是什么样子的?可能您只是在相等x值的块之间缺少一条空行。好的。主要的一点是,您需要一个规则的网格来绘制热图。有
dgrid3d
为您创建网格,但这可能不是您想要的,因为它将数据插值到常规网格的点。如果节点不是真正的网格,或者不应该插值以创建连续曲面,则可能需要使用不同的打印样式,如圆形如果使用
plot。。。使用图像
,您可以获得实际需要的颜色。使用
splot。。。使用pm3d
通过插值四个角的值来确定单个四边形的颜色(有关如何选择此插值,请参见pm3d的选项
corners2color
)。
(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
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