- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法搜索 ggplot_build()
的整个输出(或任何其他功能),几乎就像搜索文件夹的每个子目录的完整内容?
详细信息:
我正在寻找 Retrieve values for axis labels in ggplot2_3.0.0 的解决方案,早期的答案之一表明,取决于 ggplot2
版本,正确的答案很可能包含 $layout
部分和/或$x.labels
在 ggplot_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/
有没有办法搜索 ggplot_build() 的整个输出(或任何其他功能),几乎就像搜索文件夹的每个子目录的完整内容? 详细信息: 我正在寻找 Retrieve values for axis lab
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
我有一个与 this one 相关的问题关于如何在 ggplot boxplot 中自定义凹口。问题的作者回复了自己,并用 ggplot_build() 给出了提示,但不幸的是我无法使用它。 所以我的
我正在通过更改 ggplot_build 生成的数据来修改使用 ggplot 构建的图形(原因类似于 Include space for missing factor level used in fi
我想使用 ggplot_build 和 ggplot_gtable 函数更改 R 中的 ggplot2 绘图,然后在 plot_grid< 中使用它. 制作情节的示例代码: library(ggplo
我想使用 ggplot_build 和 ggplot_gtable 函数更改 R 中的 ggplot2 绘图,然后在 plot_grid< 中使用它. 制作情节的示例代码: library(ggplo
我有以下 R ggplot 代码: require(ggplot2) require(ggthemes) df <- data.frame(x=1:10, y=5*(1:10)) p <- ggplo
我手头有一个非常复杂的案例 ggplot2 .我尝试使用 iris 用 MWE 举例说明它数据如下。 我只有方面的箱线图,并且想移动图例以占据空方面的空间。 这一切都很好,我用 lemon::repo
我是一名优秀的程序员,十分优秀!