2011-11-22 23 views
39

Tôi đang cố gắng tạo một biểu đồ tương tự như sơ đồ được trình bày bởi "Luồng khách truy cập" gần đây của Google Analytics. Chúng còn được gọi là Alluvial diagrams.cách tạo biểu đồ/sơ đồ như Luồng khách truy cập của Google Analytics?

Tôi có thể sử dụng giải pháp dựa trên web hoặc không dựa trên web, miễn là tôi có thể tự chạy nó.

Các dữ liệu tôi muốn hình dung như sau:

  • lúc t1, ​​tôi có đơn vị x1, chia thành các phần n1
  • lúc t2, các bộ phận n1 chia (hoặc sáp nhập) vào n2 các bộ phận, với đơn vị x2
    • tôi muốn hiển thị vị trí các phần tách/hợp nhất đang diễn ra.

Dữ liệu của tôi hiện đang trình bày với một digraph trong NetworkX, nhưng điều này có thể không thích hợp, kể từ khi tôi có thể xuất dữ liệu của tôi ở định dạng bất kỳ yêu cầu.

Similar to the diagram below

Trả lời

58

Tôi nghĩ đây là một câu hỏi thú vị, vì vậy tôi đã thực hiện một sơ đồ phù sa ví dụ sử dụng d3: http://nickrabinowitz.com/projects/d3/alluvial/alluvial.html

Và, bởi vì d3 là rất giỏi trong việc hình ảnh động, và tôi nghĩ rằng nó sẽ trông mát mẻ, Tôi cũng đã tạo một phiên bản hoạt ảnh: http://nickrabinowitz.com/projects/d3/alluvial/alluvial-dynamic.html

Nó không bao gồm mọi thứ bạn có thể muốn, nhưng hy vọng nó sẽ cung cấp một số cơ sở. Khối mã lớn ngay từ đầu chỉ là tạo dữ liệu giả - bạn có thể thay thế dữ liệu này bằng dữ liệu thực của bạn hoặc tải nó bằng cách sử dụng d3.json. Định dạng dự kiến ​​cũng tương tự như d3 cấu trúc nút DOM hy vọng cho các biểu đồ mạng:

{ 
    // list of time slots t1 through tn 
    times: [ 
     // list of t1 nodes 
     [ 
      { 
       nodeName: "Node 1", 
       id: 1, 
       nodeValue: 24332 
      }, 
      // etc ... 
     ], 
     // etc ... 
    ], 
    // list of all links 
    links: [ 
     { 
      source: 1, // id of source node 
      target: 5, // id of target node 
      value: 3243 
     }, 
     // ... etc 
    ] 
} 

Tôi hy vọng đó là hữu ích - điều này không phải là một điển hình SO Đáp lại, và nó có khả năng sẽ đòi hỏi một số tiền nhất định của việc tùy chỉnh để nhu cầu của bạn, nhưng tôi nghĩ nó có thể hữu ích.

+0

này là rất tốt! Tôi sẽ thử cái này ngay bây giờ. – pocketfullofcheese

+2

một ví dụ khác, cũng sử dụng d3.js http://www.theage.com.au/national/parsets – pocketfullofcheese

+0

rằng liên kết cuối cùng là một tích hợp trơn tru Mr Cheese –

-1

xem xét tọa độ song song mưu trong R

! [Parallel Phối Đồ thị của một cuộc đua ngựa] [1]

df <- structure(list(Horse = structure(c(11L, 16L, 13L, 15L, 3L, 18L, 10L, 17L, 19L, 8L, 5L, 9L, 1L, 4L, 12L, 2L, 14L, 7L, 6L), 
.Label = c("Advice", "Atomic Rain", "Chocolate Candy", "Desert Party", "Dunkirk", "Flying Private" 
, "Friesan Fire", "General Quarters", "Hold Me Back", "Join in the Dance", "Mine That Bird", "Mr. Hot Stuff", "Musket Man" 
, "Nowhere to Hide", "Papa Clem", "Pioneer of the Nile", "Regal Ransom", "Summer Bird", "West Side Bernie") 
, class = "factor") 
, X1.4 = c(19L, 3L, 8L, 5L, 17L, 16L, 1L, 2L, 13L, 12L, 9L, 14L, 15L, 4L, 18L, 10L, 11L, 6L, 7L) 
, X1.2 = c(19L, 3L, 8L, 4L, 12L, 16L, 1L, 2L, 17L, 13L, 10L, 5L, 15L, 6L, 18L, 9L, 14L, 7L, 11L) 
, X3.4 = c(19L, 4L, 7L, 3L, 15L, 16L, 1L, 2L, 14L, 11L, 9L, 6L, 17L, 5L, 18L, 10L, 12L, 8L, 13L) 
, X1m = c(12L, 2L, 7L, 4L, 8L, 15L, 1L, 3L, 17L, 10L, 11L, 5L, 13L, 6L, 16L, 9L, 18L, 14L, 19L) 
, Str = c(1L, 2L, 4L, 3L, 7L, 9L, 5L, 6L, 13L, 10L, 12L, 8L, 14L, 11L, 16L, 15L, 18L, 17L, 19L) 
, Finish = 1:19), .Names = c("Horse", "X1.4", "X1.2", "X3.4", "X1m", "Str", "Finish") 
, class = "data.frame", row.names = c(NA, -19L)) 

library(ggplot2) 

df$Horse <- with(df, reorder(Horse, Finish)) 
dfm <- melt(df) 

#add a volume metric 
dfm$volume <- ifelse(dfm$variable == "X1.4" & dfm$value <= 6,6, 
       ifelse(dfm$variable == "X1.4" & dfm$value > 6 & dfm$value <= 12,6, 
      ifelse(dfm$variable == "X1.4" & dfm$value > 12,7,1))) 
dfm$volume <- ifelse(dfm$variable == "X1.2" & dfm$value <= 9,9, 
       ifelse(dfm$variable == "X1.2" & dfm$value > 9 & dfm$value<= 14,5, 
      ifelse(dfm$variable == "X1.2" & dfm$value > 14,5,dfm$volume))) 
dfm$volume <- ifelse(dfm$variable == "X3.4" & dfm$value <= 3,3, 
        ifelse(dfm$variable == "X3.4" & dfm$value > 3 & dfm$value <= 19,1,dfm$volume)) 

#Alter the race for some neck to neck action 
dfm$value <- ifelse(dfm$variable == "X1.4" & dfm$value <= 6,4, 
       ifelse(dfm$variable == "X1.4" & dfm$value > 6 & dfm$value <= 12,8,dfm$value)) 
dfm$value <- ifelse(dfm$variable == "X1.2" & dfm$value <= 9,5, 
       ifelse(dfm$variable == "X1.2" & dfm$value > 9 & dfm$value <= 14,11,dfm$value)) 
dfm$value <- ifelse(dfm$variable == "X3.4" & dfm$value <= 3,2, 
       ifelse(dfm$variable == "X3.4" & dfm$value > 3 & dfm$value <= 19,11,dfm$value)) 


p <- ggplot(dfm, aes(factor(variable), value, group = Horse, colour = Horse, label = Horse)) 
p1 <- p + geom_line(aes(size = volume), labels = labels) + geom_text(data = subset(dfm,variable == "Finish"), 
aes(x = factor(variable + 0.5)), size = 3.5, hjust = 0.8) 

labels <- c(expression(1/4), expression(1/2),expression(3/4), "1m", "Str", "Finish","") 

p1 + theme_bw() + opts(legend.position = "none", 
    panel.border = theme_blank(), axis.ticks = theme_blank()) + 
    scale_x_discrete(breaks = c(levels(dfm$variable), 
     ""), labels = labels) + scale_y_continuous(breaks = NA, 
    trans = "reverse") + xlab(NULL) + ylab(NULL) 


# Credit and other notes: 
# http://learnr.wordpress.com/2009/05/06/ggplot2-bump-chart/ 
# ![enter image description here][1]http://had.co.nz/ggplot/plot-templates.html Parallel coordinates plot 
+0

Chức năng không được chấp nhận (opts, theme_blank ..) và các lỗi khác trong ví dụ này. – geotheory