5

是否可以使用六边形作为基本形式而不是圆形来绘制 SOM 地图(包 Kohonen)?现在,不同的绘图(计数、变化等)被绘制为带有白色环境的圆圈。

目的是创建类似于 Matlab SOM Toolbox 的 SOM 视觉效果。

这个讨论表明六边形绘图在 2010 年是不可能的。

4

3 回答 3

7

即使已经有了答案,也许这种不同的方法会是一个很好的补充。使用代码,您可以创建类似于下面的热图

为我的虚拟 SOM 生成的 SOM 热图

我从围绕 kohonen 包编写的更广泛的程序中获取了这段代码。你可以在这里找到我对该程序的完整解释:http: //nbremer.blogspot.nl/2013/07/on-creation-of-extended-self-organizing.html

它有点编码,您需要从特定类型的变量开始:输入<<Heatmap matrix variable>>是一个矩阵,它将是您的热图的数字表示。这里 [1,1] 将成为左下节点(第 1 行第 1 列),[1,2] 将成为右侧节点,[2,1] 将成为第二行左侧第一个节点等等。因此,在视觉上,您在热图中从左下角到右上角工作,而在矩阵中,您从左上角到右下角工作

library(RColorBrewer) #to use brewer.pal
library(fields) #to use designer.colors

#Function to create the polygon for each hexagon
Hexagon <- function (x, y, unitcell = 1, col = col) {
  polygon(c(x, x, x + unitcell/2, x + unitcell, x + unitcell, 
            x + unitcell/2), c(y + unitcell * 0.125, y + unitcell * 
                               0.875, y + unitcell * 1.125, y + unitcell * 0.875, 
                               y + unitcell * 0.125, y - unitcell * 0.125), 
          col = col, border=NA)
}#function

#Start with a matrix that would be the numerical representation of you heatmap
#Here [1,1] will become the lower left node (1st row, 1st column), 
#[1,2] will become the node to the right
#[2,1] will be the first node to the left in the second row
#So visually you work your way from bottom left to top right
x <- as.vector(<<Heatmap matrix variable>>)

#Number of rows and columns of your SOM
SOM_Rows <- dim(<<Heatmap matrix variable>>)[1]
SOM_Columns <- dim(<<Heatmap matrix variable>>)[2]

#To make room for the legend
par(mar = c(0.4, 2, 2, 7))

#Initiate the plot window but do show any axes or points on the plot
plot(0, 0, type = "n", axes = FALSE, xlim=c(0, SOM_Columns), 
     ylim=c(0, SOM_Rows), xlab="", ylab= "", asp=1)

#Create the color palette 
#I use designer.colors to interpolate 50 colors between 
#the maxmimum number of allowed values in Brewer 
ColRamp <- rev(designer.colors(n=50, col=brewer.pal(9, "Spectral")))

#Make a vector with length(ColRamp) number of bins between the minimum and 
#maximum value of x. 
#Next match each point from x with one of the colors in ColorRamp
ColorCode <- rep("#FFFFFF", length(x)) #default is all white
Bins <- seq(min(x, na.rm=T), max(x, na.rm=T), length=length(ColRamp))
for (i in 1:length(x))
    if (!is.na(x[i])) ColorCode[i] <- ColRamp[which.min(abs(Bins-x[i]))] 

#Actual plotting of hexagonal polygons on map
offset <- 0.5 #offset for the hexagons when moving up a row
for (row in 1:SOM_Rows) {
  for (column in 0:(SOM_Columns - 1)) 
     Hexagon(column + offset, row - 1, col = ColorCode[row + SOM_Rows * column])
  offset <- ifelse(offset, 0, 0.5)
}

#Add legend to the right if you want to
image.plot(legend.only=TRUE, col=ColRamp, zlim=c(min(x, na.rm=T), max(x, na.rm=T)))
于 2013-11-19T13:58:26.710 回答
5

我没有足够的声誉来评论@NBremer 的回答。我已经扩展了上面的代码,以允许可视化大型组件平面和 u 矩阵,以便从 R“kohonen”库中输出。此处提供的代码和工作示例:

R SOM 可视化函数

输出细节

于 2013-12-28T18:32:47.077 回答
3

您可以使用 Voronoi 图来获得填充空间的表示(六边形)。

  • 十六进制网格坐标存储在$grid$pts对象kohonen中,
  • 代码在$codes

lattice把它和一个情节放在一起:

require ("kohonen")
require ("latticeExtra")
require ("deldir")
som.wines <- som (scale (wines), grid = somgrid(5, 5, "hexagonal"))

df <- as.data.frame (cbind (som.wines$grid$pts, som.wines$codes))
levelplot (alcohol ~ x * y, data = df, panel = panel.voronoi, aspect = "iso)

产量:

kononen 地图十六进制图

(我不确定,但我想这在 2010 年就已经可能了)。

于 2013-11-08T12:54:49.853 回答