2015-10-15 20 views
10

Sono motivato dal presente articolo per quanto riguarda pieghevole Albero in Ralbero pieghevole in R

http://bl.ocks.org/mbostock/4339083

Sto cercando di riprodurre lo stesso esempio utilizzando un set di dati giocattolo come questo

ID  Car Bus Train Feedback_Car Feedback_Bus Feedback_Train 
23433 Yes Yes Yes  Toyota   GreyHound  Amtrak 

Quale può essere rappresentato come un albero pieghevole come segue

enter image description here

Mi chiedo se qualcuno può aiutarmi a riprodurre questo concetto (alberi collassabili) usando questo set di dati giocattolo sopra, questo esempio mi darà un'idea di come funzionano i diversi componenti, ad esempio la formattazione dei dati JSON in R ecc ... e serve come punto di partenza. Grazie in anticipo.

+0

qual è il set di dati, sopra menzionato è questo un CSV? – Cyril

+0

@ Ciril, sì è corretto –

+0

Dai un'occhiata a [questo esempio] (http://104.131.111.111:3838/ggtree/) Il sollevamento di carichi pesanti è fatto da D3.js, ma è in un'app lucida. – jeremycg

risposta

0

È possibile utilizzare il pacchetto data.tree per ottenere i dati convertiti in JSON, o anche di utilizzare il pacchetto networkD3:

dat <- read.table(text="ID  Car Bus Train Feedback_Car Feedback_Bus Feedback_Train 
23433 Yes Yes Yes  Toyota   GreyHound  Amtrak", header=TRUE) 

## Make an edgelist from your data 
edges <- rbind(cbind(dat$ID, names(dat)[2:4]), 
       cbind(names(dat)[2:4], as.vector(t(dat[5:7])))) 

library(data.tree) 
tree <- FromDataFrameNetwork(as.data.frame(edges)) 

tree 

Questo verrà stampato in questo modo:

  levelName 
1 23433    
2 ¦--Car   
3 ¦ °--Toyota 
4 ¦--Bus   
5 ¦ °--GreyHound 
6 °--Train   
7  °--Amtrak 

Ora, utilizzare la struttura ad albero per tracciare con networkD3:

lol <- ToListExplicit(tree, unname = TRUE) 

library(networkD3) 

diagonalNetwork(lol) 

Purtroppo, che non supporta ancora alberi comprimibili. Ma here è un esempio di come ottenere ciò che vuoi con Shiny. Al fine di convertire i dati in formato JSON corretto, fare semplicemente questo:

library(jsonlite) 
json <- toJSON(lol) 
+0

che è molto efficiente. Proverò l'esempio dell'albero pieghevole. –

2

ho letto il csv e rendere la struttura JSON nodo come di seguito:

d3.csv("my.csv", function(error, data) { 
    var map1 = [] 
    data.reduce(function(map, node) { 
    map1.push(node) 
    return node; 
    }, {}); 

    root = {}; 
    root.name = map1[0].ID; 
    root.children = []; 
    var car = { 
    name: "Car", 
    children: [{ 
     name: map1[0].Feedback_Car, 
     children: [] 
    }] 
    }; 
    root.children.push(car); 
    var bus = { 
    name: "Bus", 
    children: [{ 
     name: map1[0].Feedback_Bus, 
     children: [] 
    }] 
    }; 
    root.children.push(bus); 
    var train = { 
    name: "Bus", 
    children: [{ 
     name: map1[0].Feedback_Train, 
     children: [] 
    }] 
    }; 
    root.children.push(train); 

}); 

codice di lavoro here

Spero che questo aiuti!

+0

come faccio a farlo funzionare in R, basta copiare incolla? –

+0

Le mie scuse, non so R ... ho risposto perché è stato taggato in d3. – Cyril

+1

nessun problema questo mi farà iniziare. :) –

5

Questo albero pieghevole sembra davvero bello. Il mio approccio qui è, in primo luogo, creare un grafico usando igraph. Speravo che esistesse già una funzione per convertire un igraph in json, tuttavia, sembra che sia un issue su github che non è stato implementato. Quindi, ecco una semplice funzione per farlo. Quindi, puoi semplicemente collegare i dati risultanti alla sorgente collegata e hai un albero pieghevole.

## Read your data 
dat <- read.table(text="ID  Car Bus Train Feedback_Car Feedback_Bus Feedback_Train 
23433 Yes Yes Yes  Toyota   GreyHound  Amtrak", header=TRUE) 

## Make an edgelist from your data 
edges <- rbind(cbind(dat$ID, names(dat)[2:4]), 
       cbind(names(dat)[2:4], as.vector(t(dat[5:7])))) 

## Convert to a graph data structure 
library(igraph) 
g <- graph_from_edgelist(edges) 

## This is the non-interactive version 
plot(g, layout=layout.reingold.tilford(g, root='23433')) 

enter image description here

## Recursive function to make a list of nodes to be parsed by toJSON 
## call it with 'node' as the root node (here '23433') 
f <- function(g, node, size=1000) { 
    n <- neighbors(g, node, mode='out') 
    if (length(n) == 0) return(list(name=node, size=size)) 
    children <- lapply(n$name, function(x) f(g, x, size)) 
    list(name=node, children=children) 
} 

## Convert to json 
library(jsonlite) 
json <- toJSON(f(g, '23433'), auto_unbox = TRUE) 

## I made a directory collapsible to store the index.html from the linked 
## site, as well as this data 
## For completeness, you should be able to run this to see the interactive results, 
## But, of course, this is creating files on your box 
dir.create('collapsible') 
writeLines(json, 'collapsible/data.json') 

## Download the index.html 
download.file("https://gist.githubusercontent.com/mbostock/4339083/raw/0d003e5ea1686dd6e79562b37f8c7afca287d9a2/index.html", "collapsible/index.html", method='curl') 

## Replace with the correct data 
txt <- readLines('collapsible/index.html') 
txt[grepl("^d3.json", txt)] <- "d3.json('data.json', function(error, flare) {" 
writeLines(txt, 'collapsible/index.html') 

## Open in broweser 
browseURL(paste0('file://', normalizePath('collapsible/index.html'))) 

I risultati possono anche essere visto here.

+0

attualmente quando la funzione 'browseURL ...' apre una pagina Web. È vuota ..... è perché lì c'è un '{' alla fine della riga 'txt [grepl ("^d3.json ") ..... 'che non è chiuso ...? –

+1

che dovrebbe essere lì anche se sembra confuso, è solo l'apertura di quella funzione.Lo scopo di quella linea è semplicemente sostituire l'argomento dati passato a d3.json Avrà senso se guardi l'intero documento – jenesaisquoi

+0

.... hmmm ... chiedo perché sto vedendo una pagina bianca ... –

0

C'è una spiegazione dettagliata su come formattare i dati here. Si basano su this answer su come creare Json con i bambini.

Nota: penso che sarà necessario rimodellare il set di dati per ottenere le seguenti colonne: ID, Tipo di veicolo, Marchio.

Una volta che il tuo Json è pronto, prendi il file html di your example e sostituisci "flare.json" con il percorso del nostro output di dati.

0

Per quel che vale ho voluto condividere il mio modo di spingere i dati da R a D3:

<!--begin.rcode results="asis", echo=FALSE, warning=FALSE, message=FALSE 
    library(RJSONIO) 
    library(MASS) 
    set.seed(1234) 
    data <- data.frame("Sample"=rbeta(1000,10,15)) 
    out <- paste("<script type='text/javascript'> var json ='", jsonlite::serializeJSON(data), "';</script>", sep="") 
end.rcode--> 

Questo codice pezzo siede proprio all'inizio dell'elemento corpo nel mio file RHTML. Dopo averlo fatto, i dati verranno scritti all'interno del file HTML di output e potranno essere consultati da D3 tramite la variabile json. Ecco uno screenshot del file di output HTML:

enter image description here

Nella parte inferiore della foto si può vedere che è sufficiente analizzare l'oggetto json con JSON.parse() e hai i tuoi dati JS pronti :)

1

Mi scuso per essere arrivato così tardi. Penso che tu stia cercando una soluzione in R, e non una soluzione che ti costringa ad usare codice esterno. Approfitta del pacchetto k3d3. https://github.com/kaseyriver11/k3d3 Ecco cosa vogliono:

library(k3d3) 
library(RJSONIO) 
library(stringr) 

type <- c("Car", "Car", "Truck", "Truck", "Bus", "Bus") 
name <- c("Chevy", "Ford", "Chevy", "Ford", "Greyhound", "Holiday Express") 
size <- c(rep(3840,6)) 
data <- data.frame(type, name, size) 


makeList<-function(x){ 
    if(ncol(x)>2){ 
     listSplit<-split(x[-1],x[1],drop=T) 
     lapply(names(listSplit),function(y){list(name=y,children=makeList(listSplit[[y]]))}) 
    }else{ 
     lapply(seq(nrow(x[1])),function(y){list(name=x[,1][y],Percentage=x[,2][y])}) 
    } 
} 

jsonOut<-toJSON(list(name="23433",children=makeList(data))) 
jsonOut2 <- str_replace_all(jsonOut, "[\r\n]" , "") 

CTR(jsonOut2) 

Picture of Tree with Data Provided

0

Nella versione dev corrente di networkD3 (v0.4.9000 @ 2017/08/30), v'è una nuova funzione treeNetwork() che ha questo (trame interattive, pieghevoli della rete di alberi) e molte altre nuove funzionalità integrate.

È possibile installare la versione dev corrente con ...

devtools::install_github("christophergandrud/networkD3") 

e tracciare un diagramma di rete albero pieghevole con i tuoi dati utilizzando ...

library(networkD3) 

df <- read.table(header = T, stringsAsFactors = F, text = " 
ID  Car Bus Train Feedback_Car Feedback_Bus Feedback_Train 
23433 Yes Yes Yes  Toyota   GreyHound  Amtrak 
") 

links <- data.frame(nodeId = c(df$ID, names(df)[2:4], as.character(df[5:7])), 
        parentId = c("", rep(df$ID, 3), sub("^Feedback_", "", names(df[5:7])))) 
links$name <- links$nodeId 

treeNetwork(links, type = "tidy") 

ci sono ancora un sacco di bug da lavoriamo, quindi apprezzeremmo le prove, la compilazione di segnalazioni di problemi/bug e/o le richieste di estrazione. https://github.com/christophergandrud/networkD3

Problemi correlati