获得刻度/刻面范围(刻度='免费')

时间:2015-01-12 09:21:14

标签: r ggplot2

我有一个带有自由秤的刻面ggplot。现在我想在每个方面的相同RELATIVE位置注释这个情节。如果我知道如何获得每个方面的比例范围/限制,这将很容易做到。问题:有没有办法在ggplot中获得每个方面的比例?

在以下示例中,我手动完成。问题是如何通过使用facet_scales的函数构造a2(这也更精确)。如果我致电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)

2 个答案:

答案 0 :(得分:4)

您可以通过使用函数ggplot_build()转换a2来获取每个小平面轴的范围。然后轴范围存储在列表元素panel子列表ranges中,然后对于每个面板x轴范围位于元素x.range

a3<-ggplot_build(a2)

a3$panel$ranges[[1]]$x.range
[1] -39.9706 839.9986

a3$panel$ranges[[2]]$x.range
[1] -332.6769 6986.6989

答案 1 :(得分:1)

在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(),但很难进行测试;)