R
是否可以使用 R 創建“平行集”圖?
感謝 Tormod 問題(在此處發布),我遇到了Parallel Sets情節。這是它的外觀示例:( 它是泰坦尼克號數據集的可視化。例如,顯示大多數沒有倖存下來的女性屬於第三類……)
我希望能夠用 R 重現這樣的情節。這可能嗎?
謝謝, 塔爾
感謝 Hadley 的評論,這是一個僅使用基本圖形的版本。(對於以前的版本,請參閱編輯歷史)。
parallelset <- function(..., freq, col="gray", border=0, layer, alpha=0.5, gap.width=0.05) { p <- data.frame(..., freq, col, border, alpha, stringsAsFactors=FALSE) n <- nrow(p) if(missing(layer)) { layer <- 1:n } p$layer <- layer np <- ncol(p) - 5 d <- p[ , 1:np, drop=FALSE] p <- p[ , -c(1:np), drop=FALSE] p$freq <- with(p, freq/sum(freq)) col <- col2rgb(p$col, alpha=TRUE) if(!identical(alpha, FALSE)) { col["alpha", ] <- p$alpha*256 } p$col <- apply(col, 2, function(x) do.call(rgb, c(as.list(x), maxColorValue = 256))) getp <- function(i, d, f, w=gap.width) { a <- c(i, (1:ncol(d))[-i]) o <- do.call(order, d[a]) x <- c(0, cumsum(f[o])) * (1-w) x <- cbind(x[-length(x)], x[-1]) gap <- cumsum( c(0L, diff(as.numeric(d[o,i])) != 0) ) gap <- gap / max(gap) * w (x + gap)[order(o),] } dd <- lapply(seq_along(d), getp, d=d, f=p$freq) par(mar = c(0, 0, 2, 0) + 0.1, xpd=TRUE ) plot(NULL, type="n",xlim=c(0, 1), ylim=c(np, 1), xaxt="n", yaxt="n", xaxs="i", yaxs="i", xlab='', ylab='', frame=FALSE) for(i in rev(order(p$layer)) ) { for(j in 1:(np-1) ) polygon(c(dd[[j]][i,], rev(dd[[j+1]][i,])), c(j, j, j+1, j+1), col=p$col[i], border=p$border[i]) } text(0, seq_along(dd), labels=names(d), adj=c(0,-2), font=2) for(j in seq_along(dd)) { ax <- lapply(split(dd[[j]], d[,j]), range) for(k in seq_along(ax)) { lines(ax[[k]], c(j, j)) text(ax[[k]][1], j, labels=names(ax)[k], adj=c(0, -0.25)) } } } data(Titanic) myt <- subset(as.data.frame(Titanic), Age=="Adult", select=c("Survived","Sex","Class","Freq")) myt <- within(myt, { Survived <- factor(Survived, levels=c("Yes","No")) levels(Class) <- c(paste(c("First", "Second", "Third"), "Class"), "Crew") color <- ifelse(Survived=="Yes","#008888","#330066") }) with(myt, parallelset(Survived, Sex, Class, freq=Freq, col=color, alpha=0.2))