获得 scales/range 个方面(比例='free')
get scales/range of facets (scales='free')
我有一个带有自由刻度的多面 ggplot。现在我想在每个方面的相同相对位置注释此图。如果我知道如何获得每个方面的规模 range/limits,这将很容易做到。问题:有什么方法可以获取 ggplot 中每个方面的比例?
在下面的例子中,我是手动完成的。问题是如何通过使用 a2
的函数构造 facet_scales
(这也更准确)。如果我调用 str(a2)
,它会给我一个 a2$scales
的解释。它还指出一个有用的函数可能是 get_scales()
。可悲的是,我不知道如何调用这个函数。
library(ggplot2)
a <- ggplot(data = msleep, aes(x = bodywt, y = sleep_total))+ geom_point()
a2 <- a + facet_wrap(~vore, scales="free")
a2
facet_scales = data.frame(vore=c(levels(msleep$vore), NA),
x_min = c(0,0,0,0,0),
x_max = c(800,7000,60,90,4),
y_min = c(0,0,5,7.5,5),
y_max = c(20,18,21,19,15)
)
a2 + geom_rect(data=facet_scales, mapping =aes(xmin=x_min, xmax=x_max, ymin=y_min,
ymax=(y_max+y_min)/3, x=NULL, y=NULL ), color='yellow', alpha=0.2)
将a2用函数ggplot_build()
进行转换,即可得到各个面轴的范围。然后轴范围存储在列表元素 layout
子列表 panel_params
中,然后对于每个面板,x 轴范围存储在元素 x.range
中
a3 <- ggplot_build(a2)
a3$layout$panel_params[[1]]$x.range
[1] -39.9706 839.9986
a3$layout$panel_params[[2]]$x.range
[1] -332.6769 6986.6989
基于 Didzis 的回答,我构建了一个函数来提取范围:
get_facet_ranges <- function (x){
ret <- x$panel$layout
for (i in 1:nrow(ret)){
print(i)
x_range <- x$panel$ranges[[i]]$x.range
y_range <- x$panel$ranges[[i]]$y.range
ret[i, "x_min"] <- x_range[1]
ret[i, "x_max"] <- x_range[2]
ret[i, "y_min"] <- y_range[1]
ret[i, "y_max"] <- y_range[2]
}
return(ret)
}
现在我可以轻松地按照我的问题中的描述对每个方面进行注释:
library(ggplot2)
a <- ggplot(data = msleep, aes(x = bodywt, y = sleep_total))+ geom_point()
a2 <- a + facet_wrap(~vore, scales="free")
a2
facet_scales = get_facet_ranges(ggplot_build(a2) )
a2 + geom_rect(data=facet_scales, mapping =aes(xmin=x_min, xmax=x_max, ymin=y_min,
ymax=(y_max-y_min)/3 +y_min,
x=NULL, y=NULL ),
color='yellow', alpha=0.2)
该函数应该适用于 facet_grid()
和 facet_wrap()
,但几乎没有经过测试 ;)
我有一个带有自由刻度的多面 ggplot。现在我想在每个方面的相同相对位置注释此图。如果我知道如何获得每个方面的规模 range/limits,这将很容易做到。问题:有什么方法可以获取 ggplot 中每个方面的比例?
在下面的例子中,我是手动完成的。问题是如何通过使用 a2
的函数构造 facet_scales
(这也更准确)。如果我调用 str(a2)
,它会给我一个 a2$scales
的解释。它还指出一个有用的函数可能是 get_scales()
。可悲的是,我不知道如何调用这个函数。
library(ggplot2)
a <- ggplot(data = msleep, aes(x = bodywt, y = sleep_total))+ geom_point()
a2 <- a + facet_wrap(~vore, scales="free")
a2
facet_scales = data.frame(vore=c(levels(msleep$vore), NA),
x_min = c(0,0,0,0,0),
x_max = c(800,7000,60,90,4),
y_min = c(0,0,5,7.5,5),
y_max = c(20,18,21,19,15)
)
a2 + geom_rect(data=facet_scales, mapping =aes(xmin=x_min, xmax=x_max, ymin=y_min,
ymax=(y_max+y_min)/3, x=NULL, y=NULL ), color='yellow', alpha=0.2)
将a2用函数ggplot_build()
进行转换,即可得到各个面轴的范围。然后轴范围存储在列表元素 layout
子列表 panel_params
中,然后对于每个面板,x 轴范围存储在元素 x.range
a3 <- ggplot_build(a2)
a3$layout$panel_params[[1]]$x.range
[1] -39.9706 839.9986
a3$layout$panel_params[[2]]$x.range
[1] -332.6769 6986.6989
基于 Didzis 的回答,我构建了一个函数来提取范围:
get_facet_ranges <- function (x){
ret <- x$panel$layout
for (i in 1:nrow(ret)){
print(i)
x_range <- x$panel$ranges[[i]]$x.range
y_range <- x$panel$ranges[[i]]$y.range
ret[i, "x_min"] <- x_range[1]
ret[i, "x_max"] <- x_range[2]
ret[i, "y_min"] <- y_range[1]
ret[i, "y_max"] <- y_range[2]
}
return(ret)
}
现在我可以轻松地按照我的问题中的描述对每个方面进行注释:
library(ggplot2)
a <- ggplot(data = msleep, aes(x = bodywt, y = sleep_total))+ geom_point()
a2 <- a + facet_wrap(~vore, scales="free")
a2
facet_scales = get_facet_ranges(ggplot_build(a2) )
a2 + geom_rect(data=facet_scales, mapping =aes(xmin=x_min, xmax=x_max, ymin=y_min,
ymax=(y_max-y_min)/3 +y_min,
x=NULL, y=NULL ),
color='yellow', alpha=0.2)
该函数应该适用于 facet_grid()
和 facet_wrap()
,但几乎没有经过测试 ;)