ruby 自组织图输出的 gnuplot 热图
ruby gnuplot heatmap for Self Organizing Map outputs
我正在 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
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) 并根据距离为每个节点着色(短距离为白色,最大距离为深绿色)。
主要问题是我没有成功地用下面粘贴的代码绘制出我想要的东西。我想我无法粘贴屏幕截图,因为我还不够 post..
编辑 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 簇
用距离的最大值填充节点数组,然后用下面的代码绘制(我没有放 link 因为我还需要 10 个声望点到 post 超过 2 links :/)
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
我正在 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
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) 并根据距离为每个节点着色(短距离为白色,最大距离为深绿色)。
主要问题是我没有成功地用下面粘贴的代码绘制出我想要的东西。我想我无法粘贴屏幕截图,因为我还不够 post..
编辑 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 簇
用距离的最大值填充节点数组,然后用下面的代码绘制(我没有放 link 因为我还需要 10 个声望点到 post 超过 2 links :/)
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