用k-means聚类对ggplot的绘图矩阵进行着色?

5
我正在尝试使用ggplot2创建一个包含6个数据变量的成对图,并根据它们所属的k-means聚类对点进行着色。我阅读了高度出色的“GGally”软件包的文档以及Adam Laiacano的非正式修复[http://adamlaiacano.tumblr.com/post/13501402316/colored-plotmatrix-in-ggplot2]。不幸的是,我在两者中都没有找到任何方法来获得所需的输出。
以下是示例代码:-
#The Swiss fertility dataset has been used here

data_ <- read.csv("/home/tejaskale/Ubuntu\ One/IUCAA/Datasets/swiss.csv", header=TRUE)
data_ <- na.omit(data_)

u <- c(2, 3, 4, 5, 6, 7)
x <- data_[,u]
k <- 3
maxIterations <- 100
noOfStarts <- 100
filename <- 'swiss.csv'

library(ggplot2)
library(gridExtra)
library(GGally)

kmeansOutput <- kmeans(x, k, maxIterations, noOfStarts)

xNew <- cbind(x[,1:6], as.factor(kmeansOutput$cluster))
names(xNew)[7] <- 'cluster'
kmeansPlot <- ggpairs(xNew[,1:6], color=xNew$cluster)

OR

kmeansPlot <- plotmatrix(xNew[,1:6], mapping=aes(colour=xNew$cluster))

两个图形都已经创建,但没有按簇着色。

希望我没有在论坛上错过这个问题的答案,如果确实如此,我深表歉意。任何帮助都将不胜感激。

谢谢!


1
你也可以使用普通的绘图命令,在col参数中传递clusterIDs来完成这个操作。 - Thomas Jungblut
谢谢您的回答,@ThomasJungblut。但我不确定我完全理解了它。您是否建议使用facets?我尝试使用https://dev59.com/F3M_5IYBdhLWcg3wlETO上给出的示例来玩facet_grid。然而,它们并没有为我的目的服务。一个最小的例子将对我更好地理解您的建议有巨大的帮助。再次感谢! - tejas_kale
这只是一个普通的散点图,根据聚类着色您的点。请参阅正常的kmeans文档:http://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html,在底部:`plot(x, col = cl$cluster)其中cl$cluster`是分配给簇的值。 - Thomas Jungblut
好的,我理解你的意思了。但是我想使用 'ggplot2' 来生成这个图形,并且我不认为我可以在这里用 'qplot' 替换 'plot'。你有什么想法如何使用'ggplot2' 来完成这个任务? - tejas_kale
1个回答

4
以下是稍微修改过的plotmatrix2,我认为它很好用:
plotmatrix2 <- function (data, mapping = aes())
{
    grid <- expand.grid(x = 1:ncol(data), y = 1:ncol(data))
    grid <- subset(grid, x != y)
    all <- do.call("rbind", lapply(1:nrow(grid), function(i) {
        xcol <- grid[i, "x"]
        ycol <- grid[i, "y"]
        data.frame(xvar = names(data)[ycol], yvar = names(data)[xcol], 
            x = data[, xcol], y = data[, ycol], data)
    }))
    all$xvar <- factor(all$xvar, levels = names(data))
    all$yvar <- factor(all$yvar, levels = names(data))
    densities <- do.call("rbind", lapply(1:ncol(data), function(i) {
        data.frame(xvar = names(data)[i], yvar = names(data)[i], 
            x = data[, i])
    }))
    densities$xvar <- factor(densities$xvar, levels = names(data))
    densities$yvar <- factor(densities$yvar, levels = names(data))
    mapping <- defaults(mapping, aes_string(x = "x", y = "y"))
    class(mapping) <- "uneval"
    ggplot(all) + facet_grid(xvar ~ yvar, scales = "free") + 
        geom_point(mapping, na.rm = TRUE) + stat_density(aes(x = x, 
        y = ..scaled.. * diff(range(x)) + min(x)), data = densities, 
        position = "identity", colour = "grey20", geom = "line")
}


plotmatrix2(mtcars[,1:3],aes(colour = factor(cyl)))

可能是ggplot2版本问题,但我不得不把密度数据框中的分面变量强制转换为因子(即使在GGally版本中也似乎有问题)。 另外,通常不要将向量传递给aes(),而应该直接使用列名。

1
这对我有用,尽管我仍在努力理解从“defaults”开始的代码功能。另外,感谢您关于“aes()”的提示。 - tejas_kale
使用最新的ggplot2版本(我记得是0.9.3.1),这会产生“找不到函数”defaults“”的错误。 - bluenote10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接