2015-11-11 12 views
6

Ich habe einige hierarchischen Daten, zBVisualisierung von hierarchischen Daten mit Kreispackung 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 

Ich möchte den Baum in einem "Top-down" Ansicht durch einen Kreis Verp Grundstück Grundstück: http://bl.ocks.org/mbostock/4063530

circle packing plot

Die oben Link ist für eine d3-Bibliothek. Gibt es eine Entsprechung, die es mir erlaubt, einen solchen Plot in ggplot2 zu erstellen?

(Ich möchte diese Handlung in einer glänzenden App, die d3 unterstützt, aber ich habe nicht zuvor d3 verwendet und bin mir nicht sicher über die Lernkurve. Wenn d3 die offensichtliche Wahl ist, werde ich versuchen, das funktioniert stattdessen Danke.)

+0

das sieht gut aus. Die Datenstruktur wäre die gleiche wie eine Treemap (sukzessive Aufteilung der kategorischen Variablen und Aggregation). Es gibt eine D3tree verfügbar von rechtzeitigen Portfolio auf Github Whit glänzende Bindungen. – jenesaisquoi

Antwort

12

Es gab zwei Schritte: (1) die Daten aggregieren, dann (2) in json konvertieren. Danach wurde das gesamte Javascript in diese Beispielseite geschrieben, sodass Sie einfach die resultierenden JSON-Daten anschließen können.

Da die aggregierten Daten eine ähnliche Struktur wie eine Treemap haben sollten, können wir das Paket treemap für die Aggregation verwenden (könnte auch eine Schleife mit sukzessiver Aggregation verwenden). Dann wird d3treeR (von Github) verwendet, um die Treemap-Daten in eine verschachtelte Liste zu konvertieren, und jsonlite, um die Liste in JSON zu konvertieren.

Ich verwende einige Beispieldaten GNI2010, im d3treeR Paket gefunden. Sie können alle Quelldateien unter plunker sehen.

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

I ersetzt auch die Source-Leitung in dem Beispiel index.html zu

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

Dann wird die index.html Feuer und Sie sollten sehen enter image description here

machbar sein, die glänzenden Bindungen erstellen sollten Verwenden Sie htmlwidgets und folgen einige Beispiele (die d3treeR Quelle hat einige). Beachten Sie, dass bestimmte Dinge nicht funktionieren, wie die Färbung. Der JSON, der hier gespeichert wird, enthält tatsächlich viele Informationen über die Knoten (alle Daten, die mit Hilfe der treemap aggregiert wurden), die Sie in der Abbildung verwenden könnten.

+1

Schön, danke! Ich bin erstaunt, wie schnell du das herausgefunden hast. Ich habe Ihre Antwort bis zum (aber ausschließlich) htmlwidgets Punkt ohne Probleme reproduziert. Die einzigen Probleme, die ich hatte (falls es jemand anderen hilft): (1) Ich musste 'Daten (GNI2010)' zuerst ausführen. (2) Anfänglich wurde in index.html eine leere Seite geladen, die durch Starten eines lokalen Servers wie in [this stack overflow answer] (http://stackoverflow.com/a/23118676/2530226) beschrieben gelöst wurde. – Eric

+0

großartig! Ich wäre gerne weiter gegangen und hätte das htmlwidget gemacht, aber ich habe keine Erfahrung damit. Wenn man sich den Code https://github.com/timelyportfolio/d3treeR/blob/master/R/d3tree.R#L122 anschaut, sieht es jedoch durchaus machbar aus. – jenesaisquoi

+1

Vielen Dank für diese Antwort. Sie können sich auch "data.tree" https://github.com/gluc/data.tree für die Aggregation und Baummanipulation ansehen. Ich habe festgestellt, dass es sehr hilfreich ist. – timelyportfolio

Verwandte Themen