2012-01-23 9 views
8

たとえば、ポイントのggplotが与えられた場合、与えられたポイントが対応するデータの行をどのように見つけ出しますか?どのようにggplot2 grobsをデータに関連づけていますか?

サンプルプロット:

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

我々はgrid.ls + grid.getでポイントが含まgrobsを得ることができます。

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

この最後の変数は、x-y座標の詳細、およびポイントサイズを、等(unclass(point_grobs[[1]])を試みる)が含まれ、私は、各ポイントが対応mtcarsにおけるデータの行を取得する方法は明らかではありません。


私はインタラクティブな散布図を作成するためにgridSVGを使用しています、私はこれをやっている理由についてkohskeの質問に答えるために。マウスをポイント上に置くと、コンテキスト情報が表示されます。 mtcarsの例では、車の名前やデータフレームのその行からの他の値を示すツールチップを表示できます。

私のハックアイデアは、これまで目に見えないテキストラベルとしてid列を含めることです。

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

次に、テキストグロブにポイントグロブからgrobsのツリーを走査し、データセットの行を表示しますラベルによってインデックスされる。

これは非常に一般的ではありません。ポイントgrob内にidの値を格納する方法があれば、はるかにクリーンになります。

+0

簡単な方法はありません。あなたの最終目標は何ですか?代わりがあるかもしれません。 – kohske

+0

@kohske:コメントが長すぎるので、私は何をしているのかを説明するために質問を更新しました。 –

+0

非常に興味深い。私はあなたの目的を理解しています。残念ながら、grobを通してデータにアクセスする方法はありません(おそらく次のリリースでさえ)。しかし、おそらく '' stat = "identity"のときにデータに関する情報を持つことは有益でしょう。あとで議論します。 – kohske

答えて

7

このスクリプトは、対話的にポイントに注釈を付けることができるSVGファイルを生成します。

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ファイルをアップロードできる場所はありますか?

+0

恐ろしい!私は、これが私のために働くためには、 'filename =" s.js "引数を削除しなければなりませんでした。ありがとうございました。 – joran

+0

それは私の間違いです。 – kohske

+0

うわー!それは深刻なコードです。どうもありがとう。 –

関連する問題