2

我想创建一条跨越两个地块的水平线,并结合拼凑包。

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) 上。 在此处输入图像描述

尝试将注释与每个图一起放置。

# 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

此方法将线放在每个图上,但不在两者之间。 在此处输入图像描述

我想要这样的东西: 在此处输入图像描述

4

2 回答 2

3

您可以使用 绘制线条grid.draw,它将线条绘制在绘图窗口中的任何其他内容上:

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

在此处输入图像描述

但是,这里有一些警告。线条的确切位置由您决定,虽然如果您经常这样做,可以通过编程方式进行定位,但一次性调整 x 和 y 值以获得线条会更快你想要它的地方,就像我在一分钟内所做的那样。

第二个需要注意的是,这条线位于 npc 空间中,而 ggplot 使用了固定间距和灵活间距的组合。这样做的结果是,只要调整绘图的大小,线条就会相对于绘图移动。同样,这可以通过编程方式修复。如果你真的想打开那罐蠕虫,你可以在我对这个问题的回答中看到一个类似的解决方案

于 2020-06-04T21:08:39.227 回答
2

我喜欢@Allan 的回答,但这是使用facet_wrap.

首先,我们需要将数据转置更长的时间,以便它以一种可以使用的形式出现facet_wrap。然后黑客开始。首先,我们需要将分面带标签移动到下方strip.position = 'bottom'。然后我们可以关闭裁剪,coord_cartesian(clip = 'off')以便可以在图形区域之外绘制线条。接下来,我们修复了xlim当您尝试在图形区域之外绘制线段时,图形绘制区域不会改变。

最后,大技巧,你geom_segment用新数据绘制 a ,所以它只绘制一个方面。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 = "") 

在此处输入图像描述

于 2020-06-04T21:27:04.843 回答