r - 从 ggplot 对象获取轴限制
问题描述
有时我会制作两个相似但数据不同的图。因此,X 轴和 Y 轴将具有不同的范围。
library(ggplot2)
library(ggpubr)
#> Loading required package: magrittr
df1 <- data.frame(x=runif(10)*2,y = runif(10)*2)
df2 <- data.frame(x=runif(10)*3,y = runif(10)*1)
p1 <- qplot(x = x, y = y, data = df1, geom = "line")
p2 <- qplot(x = x, y = y, data = df2, geom = "line")
ggarrange(p1,p2)
由reprex 包于 2020-07-09 创建(v0.3.0)
xlim
这可以通过用and显式声明一个范围来手动克服ylim
,但这既令人厌烦,如果不小心可能会导致某些数据超出指定范围。
一个理想的解决方案是从 动态获取限制p1
,如果这些大于的限制,则p2
使用这些限制来代替p2
。例如p2 + xlim(getLimits(p1))
.
支持这样的东西吗?
编辑:
有人提出了这个问题,但答案似乎来自旧版本的ggplot2
. 此外,supportedp1$coordinates$limits
仅返回手动指定的限制,这违背了目的。
解决方案
ggplot 现在具有layer_***
从 ggplot 中提取信息的便利功能。在这种情况下,您可以使用以下layer_scales
功能:
layer_scales(p1)$y$get_limits()
[1] 0.1499588 1.9527970
因此,您可以执行以下操作:
library(tidyverse)
library(patchwork)
library(ggpubr)
theme_set(theme_bw())
set.seed(2)
df1 <- data.frame(x=runif(10)*2,y = runif(10)*2)
df2 <- data.frame(x=runif(10)*3,y = runif(10)*1)
p1 <- qplot(x = x, y = y, data = df1, geom = "line")
p2 <- qplot(x = x, y = y, data = df2, geom = "line")
fnc = function(...) {
p = list(...)
yr = map(p, ~layer_scales(.x)$y$get_limits()) %>%
unlist %>% range
xr = map(p, ~layer_scales(.x)$x$get_limits()) %>%
unlist %>% range
p %>% map(~.x + xlim(xr) + ylim(yr))
}
wrap_plots(fnc(p1, p2))
推荐阅读
- php - 在 Woocommerce 存档页面中显示产品星级并计数低于价格
- json - 在node.js中提交表单时出现错误“TypeError:无法读取未定义的属性'名称'”
- excel - 将表格与其他工作表中的列表进行比较并删除任何匹配项
- c# - 将数据从数据库复制到excel文件,花费太多时间
- qt - 为什么我从 google drive rest api 得到服务器回复被禁止?
- django - 带有不同注释的 Django QuerySet OR
- django - django 错误日志的最佳文件大小是多少。大字段是否会导致服务器运行缓慢?
- c++ - 实例化多种类型的成员函数模板
- javascript - 将对象属性转换为对象数组
- javascript - Javascript:更改表格行 HTML