gpt4 book ai didi

r - ggplot2:如何使用 ggplot_build() 检查绘图的每个元素?

转载 作者:行者123 更新时间:2023-12-02 11:13:30 26 4
gpt4 key购买 nike

有没有办法搜索 ggplot_build() 的整个输出(或任何其他功能),几乎就像搜索文件夹的每个子目录的完整内容?

<小时/>

详细信息:

我正在寻找 Retrieve values for axis labels in ggplot2_3.0.0 的解决方案,早期的答案之一表明,取决于 ggplot2版本,正确的答案很可能包含 $layout 部分和/或$x.labelsggplot_build(g) 的输出中。所以我开始检查ggplot_build()输出每一步。其中一个步骤类似于下面的输出。

代码片段 1:

ggplot_build(g)$layout

输出 1:

<ggproto object: Class Layout, gg>
coord: <ggproto object: Class CoordCartesian, Coord, gg>
aspect: function
clip: on

[...]

map_position: function
panel_params: list
panel_scales_x: list
panel_scales_y: list
render: function

[...]

ylabel: function
super: <ggproto object: Class Layout, gg>
>

在深处,在 panel params 下, x.labels可以找到很多有用的信息,如下所示:

代码片段 2:

ggplot_build(g)$layout$panel_params

输出 2:

[[1]]
[[1]]$`x.range`
[1] 7.7 36.3

[[1]]$x.labels
[1] "10" "15" "20" "25" "30" "35"

[[1]]$x.major
[1] 0.08041958 0.25524476 0.43006993 0.60489510 0.77972028 0.95454545

并且可以像这样直接引用:

代码片段 3:

ggplot_build(g)$layout$panel_params[[1]]$x.labels

输出3:

[1] "10" "15" "20" "25" "30" "35"
<小时/>

我尝试更优雅的方法:

我确信我可以用 capture.output() 做到这一点就像你可以使用str()如上所述here ,但据我所知,你不会找到 x.labels那里也有。我不会用该输出淹没问题,因为它大约有 300 行长。

谢谢您的建议!

<小时/>

最佳答案

此函数遍历嵌套列表结构并查找通过该结构的包含给定字符串的路径:

find_name <- function(obj, name) {

# get all named paths through obj
find_paths <- function(obj, path) {

if ((!is.list(obj) && is.null(names(obj))) || identical(obj, .GlobalEnv)) {
return (path)
} else {
if (is.null(names(obj))) {
return(c(path,
lapply(seq_along(obj), function(x) find_paths(obj[[x]], paste0(path, "[[", x, "]]")))
))
} else {
return(c(path,
lapply(names(obj), function(x) find_paths(obj[[x]], paste(path, x, sep = "$")))
))
}
}

}

# get all the paths through the nested structure
all_paths <- unlist(find_paths(obj, deparse(substitute(obj))))

# find the requested name
path_to_name <- grep(paste0("\\$", name, "$"), all_paths, value = TRUE)

return (path_to_name)
}

以下是将此函数与 ggplot_built 对象一起使用的示例:

library(ggplot2)
p <- ggplot(mtcars) + geom_point(aes(x = disp, y = mpg, col = as.factor(cyl)))
gb <- ggplot_build(p)
find_name(gb, "x.labels")
## [1] "gb$layout$panel_params[[1]]$x.labels"

也可以直接获取x.labels的内容:

eval(parse(text = find_name(gb, "x.labels")))
## [1] "100" "200" "300" "400"

关于其工作原理的一些评论:

  • 函数 find_paths() 遍历嵌套结构,并以类似于 "gb$layout$panel_params[[1]]$x 的形式返回通过该结构的所有“路径” .labels".
  • 嵌套结构可以包含命名列表、未命名列表、具有另一个类的命名“列表”(因此对于 is.list() 和环境返回 FALSE。人们必须处理所有这些情况。
  • 需要特别注意的是,ggplot_built 包含对全局环境 (gb$layout$facet_params$plot_env) 的引用,如果是这样,则会导致无限循环没有得到适当的治疗。
  • find_paths() 的结果又是一个嵌套列表,但可以使用 unlist() 轻松简化结构。
  • 最后一步是提取包含要查找的名称的路径。我使用的正则表达式确保只返回与给定名称完全匹配的元素。例如,find_name(gb, "x") 不会返回 "gb$layout$panel_params[[1]]$x.labels"

我已经使用示例中的 ggplot_built 对象和嵌套列表测试了该函数。我不能保证它适用于所有情况。

关于r - ggplot2:如何使用 ggplot_build() 检查绘图的每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51791467/

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