我想结合拼接包创建一条横线穿过两个小区。
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
试着把注释与每块图放在一起。
# 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
你可以用 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使用的是固定和灵活的间隔组合。这样做的结果是,每当调整绘图的大小时,线会相对于绘图移动。同样,这也是可以通过程序固定的。如果你真的想打开这个麻烦,你可以在我的回答中看到用点来做类似的事情的解决方案。这个问题
我喜欢@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 = "")