2015-10-28 34 views
6

Sto sviluppando uno scatterplot interattivo in modo che quando l'utente scorre su un punto dati, viene visualizzata un'etichetta. Tuttavia, vorrei anche aggiungere spigoli tra alcuni punti dati.Pacchetto reticolo in R: è possibile sviluppare un "diagramma a dispersione/rete" interattivo?

Sono riuscito a sviluppare lo scatterplot interattivo utilizzando diverse librerie, tra cui grid, gridSVG, reticolo e adegraphics. Di seguito è riportato un 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") 

Il file SVG risultante compie tutto quello che sto puntando - solo che anche io desidero aggiungere alcuni bordi non interattivi. Ho provato a farlo integrando il metodo adeg.panel.edges dalla libreria adegraphics dopo aver definito i bordi e le coordinate da mappare. Quindi, in sostanza la mia funzione xplot (...) da prima viene sostituito con:

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

Sembra che questo cancella semplicemente il grafico a dispersione interattivo realizzato dalla xyplot originale, e semplicemente emette il bordo statica e immagine coordinata.

Ho cercato di seguire l'esempio visto in (http://finzi.psych.upenn.edu/library/adegraphics/html/adeg.panel.nb.html). In particolare, questo esempio:

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

Sono un po 'ad una perdita quanto a come risolvere questo problema, soprattutto perché sto imitando il codice di esempio. Ogni suggerimento è molto apprezzato!

risposta

2

Se ciò che si sta cercando di realizzare è un diagramma nodo di collegamento di una rete una soluzione alternativa è quella di costringere i dati in un oggetto network e utilizzare il pacchetto ndtv per generare svg/htmlwidget trame interattive per la rete. Il pacchetto ndtv è progettato per reti dinamiche, ma genererà grafici interattivi anche per reti statiche.

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

Molto più particolare è nel tutorial http://statnet.csde.washington.edu/workshops/SUNBELT/current/ndtv/ndtv-d3_vignette.html

Tuttavia, questo non fa uso di grafica griglia/reticolo affatto

+0

Grazie, sto guardando oltre il tutorial in questo momento. Posso verificare: un utente può vincolare punti dati a determinate posizioni sugli assi xey? Quello che sto cercando di fare è avere un grafico a dispersione con i bordi in un certo senso (quindi ogni punto di dati ha un valore xey fisso, e il grafico ha una serie fissa di bordi). L'unica interazione che vorrei è se un utente si sposta su un punto dati, le informazioni su quel punto dati verranno stampate. – luckButtered

+1

si può sicuramente passare in una serie di coordinate xey (come una matrice a 2 colonne tramite l'argomento 'coord') per i vertici/punti. Non sono sicuro se sia possibile disabilitare le altre interazioni (zoom, edge hilite) – skyebend

+0

Grazie, lo esaminerò! Sto mantenendo la domanda aperta anche perché sto cercando di rimanere con quello che ho per il momento. Sono particolarmente curioso di sapere perché la mia sintassi non ha successo dato il codice di esempio. L'ho appena modificato per mostrare il codice esatto di esempio, piuttosto che fornire semplicemente un collegamento, in modo che i futuri soccorritori possano vedere cosa sto cercando di fare. Grazie ancora. – luckButtered