R ggplot2相对于视口定位几何图形文字或几何图形标签

R ggplot2相对于视口定位几何图形文字或几何图形标签,r,ggplot2,R,Ggplot2,以下内容将生成一个2 x 2切面图,每个切面上具有不同的x和y范围: set.seed(1) n = 4 x = runif(n) y = runif(n) df = data.frame(x,y) cv = c(0,0.5,1) df$facetx = letters[cut(df$x,cv)] df$facety = letters[cut(df$y,cv)] base = ggplot(data=df,aes(x,y)) + geom_point() + facet_grid(

以下内容将生成一个2 x 2切面图,每个切面上具有不同的x和y范围:

set.seed(1)
n = 4
x = runif(n)
y = runif(n)
df = data.frame(x,y)
cv = c(0,0.5,1)
df$facetx = letters[cut(df$x,cv)]
df$facety = letters[cut(df$y,cv)]

base = ggplot(data=df,aes(x,y)) + 
  geom_point() +
  facet_grid(facetx~facety,scales='free')
base
现在我想在每个面上放置一个文本/标签,如下所示:

df.labs       = expand.grid(facetx=c('a','b'),facety=c('a','b')); 
df.labs$label = sprintf("Label %s",1:nrow(df.labs))
base + 
  geom_text(data = df.labs,x=0.5,y=0.5,aes(label=label))
如何定义文本/标签的位置,使其正好是沿面距离的一小部分,例如x=0.75,y=0.75(水平方向四分之三,垂直方向四分之三)


换句话说,我希望它相对于镶嵌面视口而不是视口中渲染的点的值进行定位。

因此我最终创建了一个“分数”位置调整,如下所示:

position_fraction <- function(x=0.5,y=0.5) {
ggplot2:::ggproto(NULL, PositionFraction,
                  x = x,
                  y = y)
}

PositionFraction <- ggplot2:::ggproto("PositionFraction", ggplot2::Position,
x = 0.5,
y = 0.5,
required_aes = c("x", "y"),
setup_params = function(self, data) {
  list(x = self$x, 
       y = self$y)
},
compute_layer = function(self,data, params, panel) {
  layout = panel$layout
  data  = ddply(data,'PANEL',function(df){
    p   = df$PANEL[1]; ix = which(layout$PANEL == p)[1]
    sx  = panel$x_scales[[ layout$SCALE_X[ix]  ]]
    sy  = panel$y_scales[[ layout$SCALE_Y[ix] ]]
    f   = function(v,s){ lims = s$get_limits(); v*diff(lims) + min(lims) }
    df$x = params$x
    df$y = params$y
    ggplot2:::transform_position(df, function(x) f(x,sx), function(y) f(y,sy))
  })
  data
}

annotation\u custom()
会对您有所帮助。但是,目前还不清楚如何制作
geom\uuu
版本的
annotation\u custom
。或者,使用
ggplot\u build
找到所有相关的轴限制,然后将相对位置转换为绝对位置。@baptiste创建了分数位置调整功能,请参见下面的答案。
base + 
  geom_text(data = df.labs,aes(label=label),position=position_fraction(.75,.75))