2015-11-11 1 views
6

У меня есть некоторые иерархические данные, например,Визуализация иерархических данных с упаковкой круга в 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 

Я хотел бы построить дерево «сверху вниз» через круг упаковки участка: http://bl.ocks.org/mbostock/4063530

circle packing plot

выше ссылка предназначена для библиотеки d3. Есть ли эквивалент, который позволяет мне сделать такой сюжет в ggplot2?

(Я хочу этот сюжет в блестящем приложении, которое поддерживает d3, но я раньше не использовал d3 и не уверен в кривой обучения. Если d3 - очевидный выбор, я попытаюсь заставить это работать вместо Спасибо.)

+0

, который выглядит красиво. Структура данных будет такой же, как и treemap (последовательное разделение катергорических переменных и агрегирование). Существует d3tree, доступный из своевременного портфеля на github whit блестящие привязки. – jenesaisquoi

ответ

12

Было два этапа: (1) собрать данные, затем (2) преобразовать в json. После этого весь javascript был написан на этой странице примера, поэтому вы можете просто подключить полученные json-данные.

Поскольку агрегированные данные должны иметь сходную структуру с treemap, мы можем использовать пакет treemap для выполнения агрегации (также можно использовать цикл с последовательной агрегацией). Затем d3treeR (из github) используется для преобразования данных treemap во вложенный список и jsonlite для преобразования списка в json.

Я использую некоторые данные примера GNI2010, найденные в пакете d3treeR. Вы можете увидеть все исходные файлы на 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") 

я также заменил исходную строку в примере index.html к

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

Затем запустите index.html и вы должны увидеть enter image description here

Чтобы создать блестящие привязки должны быть выполнимыми используя htmlwidgets и следуя некоторым примерам (источник имеет некоторые). Обратите внимание, что некоторые вещи не работают, как раскраска. Json, который хранится здесь, фактически содержит много информации об узлах (все данные, агрегированные с использованием treemap), которые вы могли бы использовать на рисунке.

+1

Красивые, спасибо! Я поражен тем, как быстро вы это поняли. Я воспроизвел ваш ответ до (но исключая) точку htmlwidgets без проблем. Единственные проблемы, которые у меня были (в случае, если это помогает кому-то еще): (1) Мне пришлось сначала запустить 'data (GNI2010)'. (2) Первоначально index.html загружал пустую страницу, которая была решена путем запуска локального сервера, как описано в [этом ответе stackoverflow] (http://stackoverflow.com/a/23118676/2530226). – Eric

+0

отлично! Мне бы хотелось пойти дальше и сделать htmlwidget, но у меня нет опыта с этим. Хотя, глядя на код https://github.com/timelyportfolio/d3treeR/blob/master/R/d3tree.R#L122, он выглядит вполне выполнимым. – jenesaisquoi

+1

Большое спасибо за этот ответ. Кроме того, вы можете захотеть взглянуть на 'data.tree' https://github.com/gluc/data.tree для агрегирования и древовидной обработки. Я нашел, что это очень полезно. – timelyportfolio

Смежные вопросы