在R中的3D晶格图中使用2个分组变量

时间:2013-11-19 02:53:26

标签: r lattice

我正在尝试使用R中的晶格包生成3D云图。我希望​​颜色和符号按照图中的两个不同因子进行分组。我找到了如何使用xyplot执行此操作的示例,但我无法使其适应cloud函数(请参阅图9.2的代码):

http://lmdvr.r-forge.r-project.org/figures/figures.html?chapter=09;figure=09_02;theme=stdBW;code=right

特别是panel.xyplot中有一个“下标”参数,panel.cloud中没有该参数,我不知道如何更改我的代码部分。

以下是我使用mtcars数据集进行操作的自包含示例。 cloud调用的“panel =”部分中注释掉的代码是我想要解决的问题。我想通过变量cyl为数据点着色,并使用不同的符号来表示不同的簇(来自kmeans分析)。任何建议都非常感谢。

# data
data(mtcars)

# kmeans
set.seed(321)
km <- kmeans(x = mtcars[, c(1, 3:7)], centers = 3, nstart = 1000)
mtcars$cluster <- factor(km$cluster)
mtcars$cyl <- factor(mtcars$cyl)

# pca
form <- formula(c("~", paste0(colnames(mtcars[, c(1, 3:7)]), collapse = "+")))
pca <- prcomp(form, data = mtcars[, c(1, 3:7)])

library(lattice)
library(RColorBrewer)

# set colors and points
colr <- brewer.pal(3, "Set1") 
pchr <- 0:2 

# set plot options
par.set <- list(axis.line = list(col = "transparent"),
                clip = list(panel = "off"),
                superpose.symbol = list(pch = pchr,
                                        col = colr))

# cloud plot
cloud(x[, "PC3"] ~ x[, "PC1"] * x[, "PC2"], 
     data = pca,
     zlab = "PC3", xlab = "PC1", ylab = "PC2",
     cex = 1, 
     groups = mtcars$cluster,
     type = "p",
     main = "3 cluster solution",
     screen = list(z = 20, x = -70, y = 3),
     par.settings = par.set,
     scales = list(col = "black"),
     #panel = function(x, y, z, subscripts, ...) {
     #          pch <- pchr[mtcars$cluster[subscripts]]
     #          col <- colr[mtcars$cyl[subscripts]]
     #          panel.cloud(x, y, z, pch = pch, col = col) },
     key = list(points = list(type = "p", pch = pchr, col = "black", cex = 1.2),
                text = list(paste("Cluster", levels(mtcars$cluster))),
                points = list(type = "p", pch = 1, col = colr, cex = 1.2),
                text = list(paste("Cyl", levels(mtcars$cyl))),
                columns = 1))

1 个答案:

答案 0 :(得分:1)

您可以省略groups参数并替换pch和col参数:

  ... , pch=mtcars$cyl, col=mtcars$cluster, ...

(只是为了澄清为什么我写的那里没有“x” - 对象:在R中,列表的命名元素不被视为object。在您的情况下,您可以访问该元素,因为你使用data参数允许在本地环境中访问对象“pca”的元素。我错误地推测你不能在公式中使用x[,"PC3"]形式的表达式。你能够正确评估它们。)