2015-11-11 13 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

いいですね。データ構造は、ツリーマップと同じになります(連続的に分割する文法変数と集約)。 timelyportfolioからgithub whit shinyバインディングのd3treeが入手可能です。 – jenesaisquoi

答えて

12

2つのステップがありました。(1)データを集約し、(2)jsonに変換します。その後、すべてのjavascriptがそのサンプルページに書き込まれているので、結果のjsonデータをプラグインできます。

集計されたデータは、ツリーマップと同様の構造を持つ必要があるため、treemapパッケージを使用して集約を行います(連続した集計でループを使用することもできます)。次に、d3treeR(githubから)を使用してツリーマップデータを入れ子リストに変換し、jsonliteを使用してリストをjsonに変換します。

パッケージにあるGNI2010のサンプルデータを使用しています。すべてのソースファイルはplunkerにあります。私ものindex.htmlを起動して、光沢のあるバインディングを作成するには enter image description here

が表示されるはずその後

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

に例index.htmlでソース行を置き換え

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

はなんとかする必要がありますhtmlwidgetsといくつかの例を使用してください(d3treeRのソースにはいくつかあります)。色付けのように、特定のことが機能していないことに注意してください。ここに格納されているjsonには、実際にノードで使用される多くの情報(treemapを使用して集計されたすべてのデータ)が含まれています。

+1

美しい、ありがとう!私はあなたがどれくらい早くこれを理解したかに驚いています。私は問題なくhtmlwidgetsのポイントまであなたの答えを再現しました。私が持っていた唯一の問題(他の人に役立つ場合): (1)まず 'data(GNI2010)'を実行しなければなりませんでした。 (2)最初はindex.htmlが空のページをロードしていましたが、[this stackoverflow answer](http://stackoverflow.com/a/23118676/2530226)で説明されているようにローカルサーバーを起動して解決しました。 – Eric

+0

素晴らしい!私はさらに進んでhtmlウィジェットを作るのが好きだっただろうが、私はその経験がない。しかし、コードhttps://github.com/timelyportfolio/d3treeR/blob/master/R/d3tree.R#L122を見ると、それはかなり実現可能です。 – jenesaisquoi

+1

この回答に感謝します。また、集約とツリー操作のために 'data.tree' https://github.com/gluc/data.treeを見たいかもしれません。私はそれが非常に有用であることがわかった。 – timelyportfolio

関連する問題