Ich wollte zu der gleichen Sache wie OP heute und landete Stücke von clusplot
und biplot
zusammen setzen. Dies ist das Ergebnis, die nützlich sein können, wenn Sie die gleiche Sache zu tun:
clusplot2 <- function(dat, clustering, ...) {
clusplot(dat, clustering, ...)
## this is from clusplot.default
pca <- princomp(dat, scores = TRUE, cor = (ncol(dat) != 2))
## this is (adapted) from biplot.princomp
directions <- t(t(pca$loadings[, 1:2]) * pca$sdev[1:2]) * sqrt(pca$n.obs)
## all below is (adapted) from biplot.default
unsigned.range <- function(x) c(-abs(min(x, na.rm = TRUE)),
abs(max(x, na.rm = TRUE)))
x <- predict(pca)[, 1:2]
y <- directions
rangx1 <- unsigned.range(x[, 1L])
rangx2 <- unsigned.range(x[, 2L])
rangy1 <- unsigned.range(y[, 1L])
rangy2 <- unsigned.range(y[, 2L])
xlim <- ylim <- rangx1 <- rangx2 <- range(rangx1, rangx2)
ratio <- max(rangy1/rangx1, rangy2/rangx2)
par(new = T)
col <- par("col")
if (!is.numeric(col))
col <- match(col, palette(), nomatch = 1L)
col <- c(col, col + 1L)
cex <- rep(par("cex"), 2)
plot(y, axes = FALSE, type = "n", xlim = xlim * ratio, ylim = ylim *
ratio, xlab = "", ylab = "", col = col[1L])
axis(3, col = col[2L])
axis(4, col = col[2L])
box(col = col[1L])
text(y, labels = names(dat), cex = cex[2L], col = col[2L])
arrows(0, 0, y[, 1L] * 0.8, y[, 2L] * 0.8, col = col[2L],
length = 0.1)
}
############################################################
library(cluster)
dat <- iris[, 1:4]
clus <- pam(dat, k = 3)
clusplot2(dat, clus$clustering, main = "Test")
Natürlich gibt es viel Raum für Verbesserungen (wie dies nur zusammen kopiert wird), aber ich denke, jeder kann es leicht anpassen, wenn nötig .
Wenn Sie sich fragen, warum die Pfeile (Ladungen * Sdev) mit 0,8 * sqrt (n) skaliert sind: Ich habe absolut keine Ahnung. Ich hätte Ladevorgänge * sdev gezeichnet, die der Korrelation zwischen den Hauptkomponenten und den Variablen ähneln sollten, aber das ist, wie biplot
es tut.
Wie auch immer, sollte dies die gleichen Pfeile wie biplot.princomp
produzieren und das gleiche pca wie clusplot
verwenden, was das primäre Ziel für mich war.
Diese Frage kann bei Cross Validated besser geeignet sein. –