将文本置于facet_wrap ggplot的边缘

r6vfmomb  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(126)

foo中的数据的下面的图中,如何将文本“50%”放在每个方面的中间值的右边距上?我想象它是一个geom_textcoord_cartesian(clip = "off"),但我不知道如何合并方面。

foo <- data.frame(x=rep(1:50,times=2),y=c(rnorm(50,mean=2),rnorm(50,mean=4)),
                                          z=rep(c("A","B"),each=50))
bar <- foo %>% group_by(z) %>% summarise(med=median(y))

ggplot(foo,aes(x,y,color=z)) + geom_point() + 
  geom_hline(data=bar,aes(yintercept = med,col=z)) +
  facet_wrap(z~.,ncol = 1) +
  theme(legend.position = "none",
        plot.margin = unit(c(1,3,1,1), "lines"))
# place "50%" in right margin at bar$med for each facet
xzlaal3s

xzlaal3s1#

你可以使用 secondary axis trick 来代替在图边距上添加注解,这意味着通过一个secondary axis来添加注解。因为你想把注解放在不同的位置,我使用了ggh4x包中的ggh4x::facetted_pos_scales,它允许为每个面单独设置breaks。这样做需要在facet_wrap中设置scales = "free_y",因为这会改变限制,所以我使用limits参数来为每个方面获得相同的限制:

library(ggplot2)
library(ggh4x)

set.seed(123)

scale_dup <- function(x) {
  scale_y_continuous(
    sec.axis = dup_axis(
      breaks = bar[bar$z == x, "med", drop = TRUE],
      labels = "50%"
    ), limits = range(foo$y)
  )
}

ggplot(foo, aes(x, y, color = z)) +
  geom_point() +
  geom_hline(data = bar, aes(yintercept = med, col = z)) +
  facet_wrap(z ~ ., ncol = 1, scales = "free_y") +
  theme(
    legend.position = "none"
  ) +
  facetted_pos_scales(
    y = list(
      z == "A" ~ scale_dup("A"),
      z == "B" ~ scale_dup("B")
    )
  )

相关问题