2017-05-31 28 views
0

數據幀使用Data.Frame中的R,以產生對角線網絡圖

df <- data.frame(
    "Level" = c(0,1,2,2,1,2) 
    ,"Name" = c("A","B","C","D","E","F") 
    ,"Value" = 1:6 
    ,stringsAsFactors = FALSE 
) 

如果下一行的水平大於當前行那麼它是當前行的子級。

例如上述數據幀要被轉換成圖表如下所示

對角線網絡

**Diagonal Network**

什麼我試圖

1)轉換數據幀爲csv(Data.csv),然後使用jsonlite將csv轉換爲JSON,然後將其作爲列表傳遞給diagonalnetw掃function.Please使用data.tree包參閱以下相同並更新路徑

library(networkD3) 
library(jsonlite) 
setwd(Path) 
df <- data.frame(
    "Level" = c(0,1,2,2,1,2) 
    ,"Name" = c("A","B","C","D","E","F") 
    ,"Value" = 1:6 
    ,stringsAsFactors = FALSE) 

write.csv(df, file =Path, row.names = FALSE) 
data1DF<-read.csv("Data.csv", header=TRUE, sep=",") 
myjson<-jsonlite::toJSON(data1DF) 
write(myjson, "data.json") 
Flare <- jsonlite::fromJSON("data.json", simplifyDataFrame =FALSE) 
diagonalNetwork (List= Flare, fontSize = 10, opacity = 0.9, margin=0) 

2)轉換數據幀到JSON,然後通過作爲列表來diagonalnetwork功能

library(data.tree) 
library(networkD3) 
df <- data.frame("Level" = c(0,1,2,2,1,2) 
     ,"Name" = c("A","B","C","D","E","F") 
     ,"Value" = 1:6 
     ,stringsAsFactors = FALSE) 

df$pathString <- paste("root2", df$Level, df$Name, df$Value, sep="/") 
root2 <-as.Node(df[,-c(1, 2)]) 
root2 <-as.list(root2) 
diagonalNetwork (List= root2, fontSize = 10, opacity = 0.9, margin=0) 

但兩者我嘗試沒有提供期望的結果。

我真正需要的

的解決方案,從數千行與層次結構類似於我們的數據幀的數據幀生成對角線網絡圖。 對圖表的方向沒有限制,無論是自頂向下還是向左,我需要的是我的數據框在正確的層次結構中。 最終,這個圖表將用於基於R閃存的應用程序。請相應地提供解決方案。

+0

歡迎SO。什麼是'Data.csv'? 'diagonalNetwork'從哪裏來?請編輯你的文章,並使其成爲[最小可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#answer-5963610) R-tag-info(懸停在標籤上)。 – lukeA

+0

@lukeA感謝您的輸入。我已編輯它,您能否提供一些解決方案。 – Tapan

回答

1

這工作:

library(data.tree) 
library(networkD3) 
df <- data.frame(from = c('A', 'B', 'B', 'A', 'E'), 
       to = c('B', 'C', 'D', 'E', 'F'), 
       stringsAsFactors = FALSE) 
root2 <- data.tree::FromDataFrameNetwork(df) 

root2 <- as.list(root2, mode = 'explicit', unname = TRUE) 

diagonalNetwork(List = root2, fontSize = 10, opacity = 0.9, margin = 0)