Визуализация иерархических данных с упаковкой кругов в 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
Ссылка выше для библиотеки d3. Есть ли эквивалент, который позволяет мне сделать такой сюжет в ggplot2?
(Мне нужен этот график в блестящем приложении, которое поддерживает d3, но я раньше не использовал d3 и не уверен насчет кривой обучения. Если d3 - очевидный выбор, я постараюсь вместо этого заставить его работать. Спасибо.)
1 ответ
Было два шага: (1) агрегирование данных, затем (2) преобразование в json. После этого весь javascript был написан на этой странице примера, так что вы можете просто вставить полученные данные json.
Поскольку агрегированные данные должны иметь структуру, аналогичную древовидной карте, мы можем использовать treemap
пакет для агрегации (также можно использовать цикл с последовательным агрегированием). Затем, d3treeR
(из github) используется для преобразования данных древовидной карты во вложенный список, и 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, и вы должны увидеть
Для создания блестящих привязок следует выполнить с помощью htmlwidgets
и следуя некоторым примерам (d3treeR
источник есть) Обратите внимание, что некоторые вещи не работают, например, раскраска. Json, который хранится здесь, на самом деле содержит много информации об узлах (все данные, агрегированные с использованием treemap
) что вы могли бы использовать на рисунке.