是否可以使用R创建“平行集”图?


16

感谢Tormod的问题(在此处发布),我遇到了“ 平行集”图。这是一个看起来像的例子:( 在此处输入图片说明 这是泰坦尼克号数据集的可视化。例如,显示了大多数未幸存的妇女是属于第三类的。)

我希望能够用R复制这样的情节。这有可能吗?

谢谢,塔尔


1
有关图形的想法,我总是检查R图形库。这是您想要的东西:R Graph Gallery parallel。我是通过在标签云中单击并行找到它的,但是可能会有更好的选择。
Nick Sabbe 2011年

1
谢谢尼克。但这在没有重大调整代码的情况下不适用于分类数据(它可能也不是构建此代码的最佳函数基础)。我希望有人可能已经做过类似的事情……
Tal Galili

Answers:


25

由于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))

亚伦,哇,妙极了-我希望我可以将它标记为V。谢谢!
Tal Galili

2
很高兴你喜欢它。好玩。:)唯一棘手的部分是获得小节应该开始和结束的位置(在getp子功能中);其余的只是绘制多边形。
亚伦-恢复莫妮卡

1
只是另panel.text一条线。参见编辑。
亚伦-恢复莫妮卡

1
您也可以在基本图形中进行透明处理。
哈德利2011年

2
你是对的。我已经完全忘记了这一点,因为习惯了做事的格子方式。对于其他感兴趣的人,您可以在颜色字符串上添加更多几个字符,例如#FF000080?rgb有详细信息。
亚伦-恢复莫妮卡

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.