呵呵,我以前还不知道这种作图方式是Andrew curves这个名字呢;以前做过一个函数,发现这个公布的函数算是标准函数,这种方式的不好之处是计算不小,尤其分类特别多的时候,但是特别直观、好看哈!所以推荐下,特别适合用于聚类完成以后,看看效果如何;至于该曲线(或者变换)的性质,就各位自己证明下。
see 这个网址:
http://addictedtor.free.fr/graphiques/graphcode.php?graph=47(上面还有很多pp的图形,我以前在什么地方推荐过的)
andrews.curves <- function(xdf, cls, npts=101, title="Classes") { <br />
n <- nrow(xdf) <br />
clss <- as.factor(cls) <br />
xpts <- seq(0, 2*pi, length=npts) <br />
X <- xpts<br />
for (i in 1:n) {<br />
xi <- unname(unlist(xdf[i, ])) <br />
ys <- andrews.function(xi, npts)<br />
X <- cbind(X, ys) <br />
}<br />
ymin <- min(X[, 2:(n+1)]) <br />
ymax <- max(X[, 2:(n+1)]) <br />
plot(0, 0, type="n", xlim=c(0, 2*pi), ylim=c(ymin, ymax), <br />
main="Andrews' Curves", xlab="", ylab="")<br />
<br />
clrs <- as.integer(clss) <br />
for (i in 2:(n+1)) {<br />
lines(X[, 1], X[, i], col=clrs[i-1]) <br />
}<br />
legend(4, ymax, levels(clss), col=c(1:nlevels(clss)), lty=1) <br />
# return(X)<br />
}<br />
<br />
andrews.function <- function (xs, no.pts=101) {<br />
n <- length(xs) <br />
xpts <- seq(0, 2*pi, length=no.pts) <br />
ypts <- c()<br />
for (p in xpts) {<br />
y <- xs[1]<br />
for (i in 2:n) {<br />
if (i %% 2 == 1) { y <- y + xs[i]*sin((i %/% 2)*p) } <br />
else { y <- y + xs[i]*cos((i %/% 2)*p) } <br />
}<br />
ypts <- c(ypts, y)<br />
}<br />
return(ypts) <br />
}<br />
###########################################################################(这是一个例子哈)<br />
data(iris) <br />
old <- par(bg="whitesmoke") <br />
andrews.curves(iris[,1:4], iris[,5], title="Iris Data") <br />
par(old)