gpt4 book ai didi

r - 如何将 ggplot2 grobs 与数据关联起来?

转载 作者:行者123 更新时间:2023-12-02 04:55:02 25 4
gpt4 key购买 nike

给定一个 ggplot,例如点,您如何找出给定点对应的数据行?

示例图:

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

我们可以通过grid.ls + grid.get获取包含点的GROB。

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 示例中,我可以显示一个工具提示,其中包含汽车名称或数据框该行中的其他值。

到目前为止,我的奇特想法是包含一个 id 列作为不可见的文本标签:

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

然后从点 grob 到文本 grob 遍历 grobs 树,并显示由标签索引的数据集的行。

这很繁琐并且不太通用。如果有一种方法可以将 id 值存储在点组中,那就会干净得多。

最佳答案

此脚本生成一个 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 文件的地方吗?

关于r - 如何将 ggplot2 grobs 与数据关联起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com