gridSVGで散布図上の点のIdentification (2)

前回のエントリ

のサンプルを確認してみたら最新の環境ではうまくいかなかったので、アップデート。

grid.garnish("geom_point.points.1", onclick="info(evt)")

で点をクリックしたときのイベントを登録しても、出力のSVGに全く反映されない。とりあえずは以下のようにすれば、期待する結果が得られる。

grid.set("geom_point.points",
         garnishGrob(grid.get("geom_point.points"), onclick="info(evt)"))

grid.garnish()のオプションでも何とかなるかもしれないが、いまのところ原因は不明。ggplot2が出力するglobの構造が変わってる可能性があるかも。

もう1つはJavaScript

id = e.target.correspondingUseElement.id;

chromeの最新版でcorrespondingUseElementがundefinedになってしまう。

id = e.target.id;

でうまくいく。単に使わなくすればよいだけ。以前のエントリでchromeのみで動作と書いたが、結果的にこれでfirefoxでもOKになった!でも当面はクロスブラウザ対策が必要かな。

全体のコードは以下。

pdf(file=NULL, width=7, height=5)

ggplot(iris, aes(Petal.Width, Petal.Length)) + 
  geom_point(aes(colour=Species, size=Sepal.Width))

grid.script(paste("var x=", toJSON(iris$Petal.Width),";",sep=""))
grid.script(paste("var y=", toJSON(iris$Petal.Length),";",sep=""))

grid.script("
	info = function(e){
		id = e.target.id;
		id = parseInt(id.replace('geom_point.points.1.',''));
		alert('Petal.Width='+x[id-1]+'\\nPetal.Length='+y[id-1]);
	}
")

grid.gedit("geom_point.points", name="geom_point.points")
grid.set("geom_point.points",
         garnishGrob(grid.get("geom_point.points"), onclick="info(evt)"))

grid.export("iris_plot.svg")
dev.off()