R包Kohonen - 如何在Matlab SOM工具箱中绘制六边形而不是圆形?

时间:2013-11-08 12:06:10

标签: r plot som

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

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

discussion表明2010年不可能进行六边形绘图。

3 个答案:

答案 0 :(得分:6)

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

Resulting SOM Heatmap for my Dummy 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]将成为第2行左边的第一个节点等 因此,您可以直观地在热图中从左下角到右上角工作,而在矩阵中,您可以从左上角到右下角工作

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)))

答案 1 :(得分:4)

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

R SOM Visualization Functions

Detail of Output

答案 2 :(得分: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 map hex plot

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