2015-10-28 42 views
6

我正在開發一個交互式散點圖,以便當用戶滾動數據點時,會顯示一個標籤。不過,我還想在特定數據點之間添加邊緣。R中的格子包:是否可以開發交互式的「散點圖/網絡」?

我成功地使用幾個庫開發交互式散點圖,包括網格,gridSVG,點陣和圖形。下面是一個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對象,並使用ndtv包生成網絡的svg/htmlwidget交互式圖。 ndtv包專爲動態網絡而設計,但也會爲靜態網絡生成交互式圖。

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

更多的細節將在本教程http://statnet.csde.washington.edu/workshops/SUNBELT/current/ndtv/ndtv-d3_vignette.html

然而,這並不能在所有

+0

使用網格/點陣圖形謝謝你,我期待在教程現在。我可以驗證:用戶是否可以將數據點限制在x軸和y軸上的特定位置?我想要做的是在某種意義上具有邊緣的散點圖(所以每個數據點都有一個固定的x和y值,並且該圖具有固定的一組邊)。我希望的唯一交互方式是,如果用戶滾動數據點,則會打印有關該數據點的信息。 – luckButtered

+1

你絕對可以傳入一組x和y座標(作爲通過'coord'參數的2列矩陣)作爲頂點/點。我不確定是否可以禁用其他交互(縮放,邊緣hilite) – skyebend

+0

謝謝,我會研究它!我也保持這個問題的開放性,因爲我正在努力堅持我現在所擁有的東西。鑑於示例代碼,我特別好奇爲什麼我的語法不成功。我只是編輯它以顯示確切的示例代碼,而不是簡單地提供一個鏈接,所以任何未來的響應者都可以看到我正在嘗試做什麼。再次感謝。 – luckButtered