2012-01-23 16 views
8

Örneğin bir noktadan oluşan bir ggplot verildiğinde, belirli bir noktanın karşılık geldiği veri sırasını nasıl bulursunuz?ggplot2 kornalarını tekrar veriye nasıl bağlarım?

Örnek bir arsa:

library(ggplot2) 
(p <- ggplot(mtcars, aes(mpg, wt)) + 
    geom_point() + 
    facet_wrap(~ gear) 
) 

Biz grid.ls + grid.get ile noktalarının içeren Grobs alabilirsiniz.

grob_names <- grid.ls(print = FALSE)$name 
point_grob_names <- grob_names[grepl("point", grob_names)] 
point_grobs <- lapply(point_grob_names, grid.get) 

Bu son değişken x-y koordinatlarının detayları ve pointsize vb (unclass(point_grobs[[1]]) deneyin) içerir, ama her bir noktanın tekabül mtcars veri satır elde nasıl açık değildir.


neden bu yapıyorum ben interaktif bir dağılım grafiğini oluşturmak için gridSVG kullanıyorum yaklaşık Kohske en soruyu cevaplamak için. Fareyi bir noktaya yuvarladığınızda, bağlamsal bilgileri görüntülemek istiyorum. Mtcars örneğinde, veri çerçevesinin o satırından arabanın adı veya diğer değerler ile bir araç ipucu gösterebilirdim.

mtcars$id <- seq_len(nrow(mtcars)) 
p + geom_text(aes(label = id), colour = NA) 

Sonra metin Grob gelin Grob gelen Grobs ağacı çapraz ve veri kümesi satırını görüntüler:

Benim hacky fikri şu ana kadar görünmez bir metin etiketi olarak bir id sütunu dahil etmektir etiket tarafından endekslendi.

Bu çok genel ve çok genellenebilir değil. id değerini grob noktasında saklamanın bir yolu varsa, daha temiz olacaktır.

+0

Kolay bir yol yok. Son hedefiniz nedir? Alternatifler olabilir. – kohske

+0

@kohske: Bir yorum için çok uzun, bu yüzden ne yaptığımı açıklamak için soruyu güncelledim. –

+0

Çok ilginç. Amacını anlıyorum. Ne yazık ki, verilere grob aracılığıyla ulaşmanın hiçbir yolu yoktur (muhtemelen bir sonraki sürümde bile). Ancak belki de veriler hakkında bilgi sahibi olmak yararlı olacaktır (özellikle "stat =" kimlik "olduğunda). Tartışacağım. – kohske

cevap

7

Bu komut dosyası, etkileşimli olarak noktalara açıklama ekleyebileceğiniz bir SVG dosyası oluşturur.

library(ggplot2) 
library(gridSVG) 

geom_point2 <- function (...) GeomPoint2$new(...) 
GeomPoint2 <- proto(GeomPoint, { 
    objname <- "point2" 
    draw <- function(., data, scales, coordinates, na.rm = FALSE, ...) { 
    data <- remove_missing(data, na.rm, c("x", "y", "size", "shape"), 
     name = "geom_point") 
    if (empty(data)) 
     return(zeroGrob()) 
    name <- paste(.$my_name(), data$PANEL[1], sep = ".") 
    with(coordinates$transform(data, scales), ggname(name, 
     pointsGrob(x, y, size = unit(size, "mm"), pch = shape, 
      gp = gpar(col = alpha(colour, alpha), fill = fill, label = label, 
       fontsize = size * .pt)))) 
    }} 
) 

p <- ggplot(mtcars, aes(mpg, wt, label = rownames(mtcars))) + geom_point2() + facet_wrap(~ gear) 
print(p) 

grob_names <- grid.ls(print = FALSE)$name 
point_grob_names <- sort(grob_names[grepl("point", grob_names)]) 
point_grobs_labels <- lapply(point_grob_names, function(x) grid.get(x)$gp$label) 

library(rjson) 
jlabel <- toJSON(point_grobs_labels) 

grid.text("value", 0.05, 0.05, just = c(0, 0), name = "text_place", gp = gpar(col = "red")) 

script <- ' 
var txt = null; 
function f() { 
    var id = this.id.match(/geom_point2.([0-9]+)\\.points.*\\.([0-9]+)$/); 
    txt.textContent = label[id[1]-1][id[2]-1]; 
} 

window.addEventListener("load",function(){ 
    var es = document.getElementsByTagName("circle"); 
    for (i=0; i<es.length; ++i) es[i].addEventListener("mouseover", f, false); 

    txt = (document.getElementById("text_place").getElementsByTagName("tspan"))[0]; 

},false); 
' 

grid.script(script = script) 
grid.script(script = paste("var label = ", jlabel)) 

gridToSVG() 

SVG dosyası yükleyebileceğim yerler biliyor musunuz?

+0

Awesome! Yine de, bunun benim için çalışmasını sağlamak için 'filename =" s.js "argümanını kaldırmam gerekiyordu. – joran

+0

teşekkürler. Bu benim hatam. – kohske

+0

Vay! Bu ciddi bir kod. Çok teşekkürler. –