2015-11-11 12 views
6

Ho alcuni dati gerarchici, ad esempio,Visualizzazione dei dati gerarchici con l'inserimento circolare in ggplot2?

> library(dplyr) 
> df <- data_frame(id = 1:6, parent_id = c(NA, 1, 1, 2, 2, 5)) 
> df 
Source: local data frame [6 x 2] 

    id parent_id 
    (int)  (dbl) 
1  1  NA 
2  2   1 
3  3   1 
4  4   2 
5  5   2 
6  6   5 

Vorrei tracciare l'albero in un "top-down", vista attraverso una trama cerchio imballaggio: http://bl.ocks.org/mbostock/4063530

circle packing plot

È possibile che questo il collegamento è per una libreria d3. C'è un equivalente che mi permetta di fare una trama del genere in ggplot2?

(Voglio questa trama in un'app lucida, che supporta d3, ma non ho usato d3 prima e sono incerto sulla curva di apprendimento.Se d3 è la scelta più ovvia, cercherò di farlo funzionare invece Grazie.)

+0

che sembra bello. La struttura dei dati sarebbe la stessa di una mappa di tre (dividere successivamente le variabili catergorie e aggregare). C'è un d3tree disponibile da timelyportfolio su github con rilegature lucenti. – jenesaisquoi

risposta

12

Ci sono stati due passaggi: (1) aggregare i dati, quindi (2) convertire in json. Dopodiché, tutto il javascript è stato scritto nella pagina di esempio, quindi puoi semplicemente inserire i dati JSON risultanti.

Poiché i dati aggregati devono avere una struttura simile a una treemap, è possibile utilizzare il pacchetto treemap per eseguire l'aggregazione (potrebbe anche utilizzare un ciclo con aggregazione successiva). Quindi, d3treeR (da github) viene utilizzato per convertire i dati di treemap in un elenco nidificato e jsonlite per convertire l'elenco in json.

Sto utilizzando alcuni dati di esempio GNI2010, trovati nel pacchetto d3treeR. Puoi vedere tutti i file sorgente su plunker.

library(treemap) 
library(d3treeR) # devtools::install_github("timelyportfolio/d3treeR") 
library(data.tree) 
library(jsonlite) 

## Get treemap data using package treemap 
## Using example data GNI2010 from d3treeR package 
data(GNI2010) 

## aggregate by these: continent, iso3, 
## size by population, and color by GNI 
indexList <- c('continent', 'iso3') 
treedat <- treemap(GNI2010, index=indexList, vSize='population', vColor='GNI', 
       type="value", fun.aggregate = "sum", 
       palette = 'RdYlBu') 
treedat <- treedat$tm # pull out the data 

## Use d3treeR to convert to nested list structure 
## Call the root node 'flare' so we can just plug it into the example 
res <- d3treeR:::convert_treemap(treedat, rootname="flare") 

## Convert to JSON using jsonlite::toJSON 
json <- toJSON(res, auto_unbox = TRUE) 

## Save the json to a directory with the example index.html 
writeLines(json, "d3circle/flare.json") 

Ho anche sostituito la linea fonte nell'esempio index.html a

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> 

Poi accendere la index.html e si dovrebbe vedere enter image description here

Per creare le associazioni lucide dovrebbe essere fattibile usando htmlwidgets e seguendo alcuni esempi (la fonte d3treeR ne ha). Nota che certe cose non funzionano, come la colorazione. Il json che viene memorizzato qui contiene in realtà molte informazioni sui nodi (tutti i dati aggregati usando lo treemap) che si potrebbe sfruttare nella figura.

+1

Bello, grazie! Sono stupito di quanto velocemente hai capito. Ho riprodotto la tua risposta fino a (ma escludendo) il punto htmlwidgets senza problemi. Gli unici problemi che ho avuto (nel caso in cui aiuti qualcun altro): (1) Ho dovuto eseguire 'data (GNI2010)' prima. (2) Inizialmente index.html stava caricando una pagina vuota, che è stata risolta avviando un server locale come descritto in [questa risposta StackOverflow] (http://stackoverflow.com/a/23118676/2530226). – Eric

+0

fantastico! Mi sarebbe piaciuto andare oltre e rendere htmlwidget, ma non ho esperienza con questo. Anche se, guardando il codice https://github.com/timelyportfolio/d3treeR/blob/master/R/d3tree.R#L122, sembra abbastanza fattibile. – jenesaisquoi

+1

Grazie mille per questa risposta. Inoltre, potresti dare un'occhiata a 'data.tree' https://github.com/gluc/data.tree per l'aggregazione e la manipolazione dell'albero. Ho trovato estremamente utile. – timelyportfolio

Problemi correlati