在ggplot2中创建横跨多个图的线。

问题描述 投票:0回答:1

我想结合拼接包创建一条横线穿过两个小区。

library(ggplot2)
library(patchwork)

# Annotation after plot
p1 <- ggplot(mtcars, aes(x=disp,y=mpg))+
  geom_point()
p2 <- ggplot(mtcars, aes(x=hp,y=mpg))+
  geom_point()
# Want line across plots at y (mpg) of 15
p3 <- (p1+p2)+annotate("segment",x=-Inf,xend=Inf,y=15,yend=15)
p3

这个方法只把线横过最后一个图(p2)。enter image description here

试着把注释与每块图放在一起。

# Annotation with each plot
p1 <- ggplot(mtcars, aes(x=disp,y=mpg))+
  geom_point()+
  annotate("segment",x=-Inf,xend=Inf,y=15,yend=15)
p2 <- ggplot(mtcars, aes(x=hp,y=mpg))+
  geom_point()+
  annotate("segment",x=-Inf,xend=Inf,y=15,yend=15)

p1+p2

这种方法把线放在每个图上,但不是在两个图之间。enter image description here

我想要这样的东西。enter image description here

r ggplot2 annotate patchwork
1个回答
2
投票

你可以用 grid.draw,它将线划在绘图窗口中的任何其他内容上。

library(grid)
p3
grid.draw(linesGrob(x = unit(c(0.06, 0.98), "npc"), y = unit(c(0.277, 0.277), "npc")))

enter image description here

然而,这里有几个注意事项。线条的准确定位由你决定,虽然如果你要经常做的话,可以通过编程来完成定位,但是对于一次性的,只需要调整x和y的值就可以更快的得到你想要的线条,就像我在一分钟内做的那样。

第二个注意事项是,线的定位是在npc空间,而ggplot使用的是固定和灵活的间隔组合。这样做的结果是,每当调整绘图的大小时,线会相对于绘图移动。同样,这也是可以通过程序固定的。如果你真的想打开这个麻烦,你可以在我的回答中看到用点来做类似的事情的解决方案。这个问题


2
投票

我喜欢@Allan的答案,但这里有一个替代性的方法,使用的是 facet_wrap.

首先,我们需要将数据旋转更长的时间,使其在一个表格中使用 facet_wrap. 然后,黑客开始。首先,我们需要将面条标签移到下面,用 strip.position = 'bottom'. 然后我们可以用 coord_cartesian(clip = 'off') 这样就可以在图形区域外绘制线条。接下来我们固定 xlim 所以当你试图绘制图形区域外的一段时,图形绘制区域不会改变。

最后,最重要的是,你绘制一个 geom_segment 新的数据,所以它只在一个方面绘图。您可以制作一个新的 data.frame 随叫随到 geom_segment 与数据,使其绘制在最后一个要渲染的面板中,所以线在上面。

最后,只是在 theme() 所以条形背景是空白的,放置在轴刻度线外。

library(ggplot2)
library(dplyr)
library(tidyr)
ggplot(pivot_longer(mtcars, -mpg) %>% filter(name %in% c("disp", "hp")),
       aes(x=value, y=mpg, group=name)) +
  geom_point() + 
  facet_wrap(.~name, strip.position = "bottom") + 
  geom_segment(data = data.frame(mpg = 15, name = "hp"),
               x=-650, xend=525, y=15, yend=15) +
  coord_cartesian(clip = 'off', xlim = c(0,500)) +
  theme(aspect.ratio = 1,
        strip.background = element_blank(),
        strip.placement = "outside") +
  labs(x = "") 

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.