2015-10-28 9 views
6

ユーザーがデータポイントをロールオーバーすると、ラベルが表示されるように、私は対話型散布図を作成しています。ただし、特定のデータポイント間にエッジを追加することもできます。Rのラティスパッケージ:インタラクティブな "散布図/ネットワーク"を開発することは可能ですか?

私は、grid、gridSVG、lattice、adegraphicsを含むいくつかのライブラリを使用してインタラクティブな散布図を作成するのに成功しています。以下はMWEです:

library(grid) 
library(gridSVG) 
library(lattice) 
library(adegraphics) 

x = rnorm(10) 
y = rnorm(10) 
dat = data.frame(label = letters[1:10], x, y) 

customPanel2 <- function(x, y, ...) { 
    for (j in 1:nrow(dat)) { 
    grid.circle(x[j], y[j], r = unit(.5, "mm"), 
       default.unit = "native", 
       name = paste("point", j, sep = ".")) 
    } 
} 

xyplot(y ~ x, panel = customPanel2, xlab = "x variable", ylab=NULL, scales=list(tck = c(1,0), y=list(at=NULL))) 

for (i in 1:nrow(dat)) { 
    grid.text(as.character(dat$label)[i], x = 0.1, y = 0.01, just = c("left", "bottom"), name = paste("label", i, sep = "."), gp = gpar(fontface = "bold.italic")) 
} 

for (i in 1:nrow(dat)) { 
    grid.garnish(paste("point", i, sep = "."), onmouseover = paste('highlight("', i, '.1.1")', sep = ""), onmouseout = paste('dim("', i, '.1.1")', sep = "")) 
    grid.garnish(paste("label", i, sep = "."), visibility = "hidden") 
} 

grid.script(filename = "aqm.js", inline = TRUE) 
grid.export("interactiveScat.svg") 

結果の.svgファイルは私が目指していますすべてのものを達成 - 私はまた、特定の非対話型のエッジを追加したいことを除いて。私は、エッジとマッピングする座標を定義した後、adegraphicsライブラリからadeg.panel.edgesメソッドを組み込み、これを実行しようとしました。だから、基本的には前から私たxplot(...)関数が置き換えられ:

edges = matrix(c(1, 2, 3, 2, 4, 1, 3, 4), byrow = TRUE, ncol = 2) 
coords <- matrix(c(x[1], y[1], x[2], y[2], x[3], y[3], x[4], y[4]), byrow = TRUE, ncol = 2) 

xyplot(y ~ x, panel = function(customPanel2){adeg.panel.edges(edges, coords, lty = 1:4, cex = 5)}, xlab = "x variable", ylab=NULL, scales=list(tck = c(1,0), y=list(at=NULL))) 

単に元xyplotから作られたインタラクティブな散布を消去し、単に静的なエッジを出力し、画像を座標と思われます。

私は、(http://finzi.psych.upenn.edu/library/adegraphics/html/adeg.panel.nb.html)に見られるような例に従いました。具体的には、この例:

edges <- matrix(c(1, 2, 3, 2, 4, 1, 3, 4), byrow = TRUE, ncol = 2) 
coords <- matrix(c(0, 1, 1, 0, 0, -1, -1, 0), byrow = TRUE, ncol = 2) 
xyplot(coords[,2] ~ coords[,1], 
    panel = function(...){adeg.panel.edges(edges, coords, lty = 1:4, cex = 5)}) 

私は、サンプルコードを模倣しています特にとして、この問題を解決する方法のように損失のビットをしています。どんな提案も大歓迎です!

答えて

2

あなたが作るしようとしているものであれば、代替ソリューションがnetworkオブジェクトにデータを強要し、ネットワークのためのSVG/htmlwidgetインタラクティブなプロットを生成するためにndtvパッケージを使用することでネットワークのノードリンクダイアグラムです。 ndtvパッケージは動的ネットワーク用に設計されていますが、静的ネット用の対話型プロットも生成します。

library(ndtv) 
data(emon) # load a list of example networks 
render.d3movie(emon[[5]]) # render network 5 in the browser 

多くの詳細は、しかし、これはすべての

+0

でグリッド/格子グラフィックスを使用していないチュートリアルhttp://statnet.csde.washington.edu/workshops/SUNBELT/current/ndtv/ndtv-d3_vignette.html

である私は、今のチュートリアルを介して探しています、ありがとうございます。私は確認することができます:ユーザーがデータポイントをx軸とy軸の特定の位置に制限できますか?私がしようとしているのは、ある意味でエッジを持つ散布図を持つことです(各データポイントには固定のxとyの値があり、グラフには固定されたエッジがあります)。私が望むのは、ユーザーがデータポイントをロールオーバーすると、そのデータポイントに関する情報が印刷されるということだけです。 – luckButtered

+1

頂点/点のx座標とy座標のセット( 'coord'引数で2列の行列)を渡すことは間違いありません。他のインタラクション(ズーム、エッジハイライト)を無効にすることが可能かどうか分かりません – skyebend

+0

ありがとう、私はそれを調べます!私は当分の間持ち続けようとしているので、私は質問を開いたままにしています。特に私の構文がうまくいかなかった理由について、私は特に興味があります。私はちょうどリンクを提供するのではなく、正確なサンプルコードを表示するように編集しました。将来のレスポンダーは私が何をしようとしているのかを見ることができます。再度、感謝します。 – luckButtered

関連する問題