Có thể tạo song song các tập hợp âm mưu sử dụng R không?


16

Nhờ câu hỏi Tormod (được đăng ở đây ) tôi đã xem qua cốt truyện Parallel Sets . Đây là một ví dụ cho vẻ ngoài của nó: nhập mô tả hình ảnh ở đây (Đây là một hình ảnh trực quan của bộ dữ liệu Titanic. Ví dụ, hiển thị, hầu hết phụ nữ không sống sót thuộc về lớp thứ ba ...)

Tôi rất thích có thể tái tạo một cốt truyện như vậy với R. Điều đó có thể làm được không?

Cảm ơn, Tal


1
Đối với ý tưởng về đồ họa, tôi luôn kiểm tra thư viện đồ thị R. Đây là một cái gì đó từ đó giống như những gì bạn yêu cầu: R Graph Gallery song song . Tôi đã tìm thấy nó bằng cách nhấp vào song song trong đám mây thẻ, nhưng có thể có các tùy chọn tốt hơn.
Nick Sabbe

1
Cảm ơn Nick. Nhưng điều này sẽ không hoạt động đối với dữ liệu phân loại mà không cần chỉnh sửa mã lớn (có lẽ nó cũng không phải là cơ sở tốt nhất để xây dựng mã này). Tôi hy vọng ai đó có thể đã làm điều gì đó tương tự ...
Tal Galili

Câu trả lời:


25

Đây là phiên bản chỉ sử dụng đồ họa cơ bản, nhờ nhận xét của Hadley. (Đối với phiên bản trước, xem lịch sử chỉnh sửa).

lần thử thứ ba

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

Aaron, wow, câu trả lời tuyệt vời - Tôi ước tôi có thể đánh dấu V hai lần. Cảm ơn bạn!
Tal Galili

2
Vui vì bạn thích nó. Đó là niềm vui. :) Phần khó khăn duy nhất là lấy các vị trí nơi các thanh nên bắt đầu và kết thúc (nằm trong getpchức năng con); phần còn lại chỉ là vẽ đa giác.
Aaron - Tái lập Monica

1
Chỉ là một panel.textdòng khác . Xem chỉnh sửa.
Aaron - Tái lập Monica

1
Bạn cũng có thể làm trong suốt trong đồ họa cơ sở.
hadley

2
Bạn đúng. Tôi đã hoàn toàn quên mất điều đó, đã quá quen với cách làm việc của mạng tinh thể. Ví dụ, đối với những người khác quan tâm, bạn thêm một vài ký tự vào chuỗi màu của mình #FF000080. ?rgbcó chi tiết.
Aaron - Tái lập Monica

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.