【发布时间】:2012-01-23 13:47:59
【问题描述】:
给定一个 ggplot,例如点,你将如何找出给定点对应的数据行?
示例图:
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 中的数据行并不明显。
为了回答 kohske 关于我为什么要这样做的问题,我使用 gridSVG 创建了一个交互式散点图。当您将鼠标滚动到一个点上时,我想显示上下文信息。在 mtcars 示例中,我可以显示带有汽车名称或数据框该行中的其他值的工具提示。
到目前为止,我的 hacky 想法是包含一个 id 列作为不可见的文本标签:
mtcars$id <- seq_len(nrow(mtcars))
p + geom_text(aes(label = id), colour = NA)
然后从点 grob 到文本 grob 遍历 grobs 树,并显示 label 索引的数据集的行。
这是繁琐的,不是很普遍。如果有办法将 id 值存储在点 grob 中,它会更干净。
【问题讨论】:
-
不容易。你的最终目标是什么?可能还有其他选择。
-
@kohske:评论太长了,所以我更新了问题来解释我在做什么。
-
非常有趣。我明白你的目的。不幸的是,我们无法通过 grob 访问数据(甚至可能在下一个版本中)。但也许拥有有关数据的信息会很有用(尤其是当 `stat = "identity" 时)。我会讨论的。
-
还有一些技术问题是ggplot2支持一个面板上的多个数据。因此,
id可能不足以识别数据行。