在ggplot上查找相对轴位置

Finding a relative axis position on a ggplot

我想弄清楚如何获得与生成的 ggplot 比例相关的 y 位置。

例如:

library(ggplot)

marks <- data.frame(mpg = c(15,25,30), cyl = c(4,8,4))

ggplot()+
  geom_point(mtcars,mapping = aes(x = mpg, y = hp))+
  facet_grid(~cyl)+
  geom_point(marks, mapping = aes(x = mpg, y = Inf), col = "red")

插入 Inf 或 -Inf 将是绘图的最大和最小范围。但是,如果我想要 90%,在这种情况下可能是 330 左右,但我不想对其进行硬编码。

实现你想要的结果的一个选择是通过 gggrid 包,它类似于 annotation_custom 允许使用相对坐标将你的标记添加为 grob,但也适用于小平面:

library(ggplot2)

marks <- data.frame(mpg = c(15,25,30), cyl = c(4,8,4))

pg <- function(data, coords) {
  grid::pointsGrob(x = coords$x, y = unit(rep(.9, length(coords$x)), "npc"),
                   gp = grid::gpar(col = "red", size = 1), pch = 16, size = unit(2, "mm"))
}

ggplot()+
  geom_point(mtcars,mapping = aes(x = mpg, y = hp))+
  facet_grid(~cyl) +
  gggrid::grid_panel(pg, data = marks, mapping = aes(x = mpg))

创建绘图后,您可以使用 ggplot_build 函数查找绘图范围来获取范围。不确定是否可以在不先将绘图创建为对象的情况下访问它。

library(ggplot)

marks <- data.frame(mpg = c(15,25,30), cyl = c(4,8,4))

p1 <- ggplot()+
  geom_point(mtcars,mapping = aes(x = mpg, y = hp))+
  facet_wrap(~cyl)

prange <- ggplot_build(p1)$layout$panel_params[[1]]$y$continuous_range

p1 + 
  geom_point(marks, mapping = aes(x = mpg, y = prange[1] + (diff(prange)*0.9)), col = "red")