ggplot2:在绘图区域之外绘制geom_segment()

时间:2018-09-19 18:44:20

标签: r ggplot2

我在ggplot2中创建了两个方面的图。我想在绘图区域外添加一个箭头。多个问题试图解决这个问题: How to draw lines outside of plot area in ggplot2? Displaying text below the plot generated by ggplot2

但是我无法使我的示例正常工作。另外,我希望有一种更简单的方法来实现这一目标?

我尝试增加plot.margins并使用coord_cartesian(),但均无济于事。

enter image description here

相反,我想要:

enter image description here

我的虚拟示例:

# read library to assess free data
library(reshape2)
library(ggplot2)


ggplot(tips,
       aes(x=total_bill,
           y=tip/total_bill)) + 
  geom_point(shape=1) +
  facet_grid(. ~ sex) +
  # define the segment outside the plot
  geom_segment(aes(x = 10, 
                   y = -0.25, 
                   xend = 10, 
                   yend = 0),
               col = "red",
               arrow = arrow(length = unit(0.3, "cm"))) +
  theme_bw() +
  # limit the displayed plot extent
  coord_cartesian(ylim = c(0, 0.75)) +
  # increase plot margins - does not help
  theme(plot.margin = unit(c(1,1,1,0), "lines"))

2 个答案:

答案 0 :(得分:3)

您可以使用clip="off"中的参数coord_cartesian在面板外部绘制。我还使用expand的{​​{1}}参数将y轴从零开始。在scale_y开始位置上有一些手动选择。

所以你的例子

y

(由于您未绘制美学图,我将library(reshape2) library(ggplot2) ggplot(tips, aes(x=total_bill, y=tip/total_bill)) + geom_point(shape=1) + facet_grid(. ~ sex) + annotate("segment", x=12, y=-0.05, xend=12, yend=0, col="red", arrow=arrow(length=unit(0.3, "cm"))) + scale_y_continuous(expand=c(0,0))+ theme_bw() + coord_cartesian(ylim = c(0, 0.75), clip="off") + theme(plot.margin = unit(c(1,1,1,0), "lines")) 更改为geom_segment

哪个生产

enter image description here

答案 1 :(得分:1)

这是一种解决方法,并非完全令人满意,因为您将需要考虑绘图的位置。原则上,它使用自定义注释,可以使用cowplot

library(ggplot2) 
library(cowplot)
library(reshape2)

首先定义具有相同坐标限制的图。

p <- 
  ggplot(tips, aes(x = total_bill, y = tip/total_bill)) + 
  geom_point(shape = 1) +
  facet_grid(. ~ sex) +
  theme_bw() +
  coord_cartesian(ylim = c(0, 0.75), xlim = c(0, 50)) 

arrow_p <- 
  ggplot(tips) +
  geom_segment(aes(x = 1, y = -1, xend = 1, yend = 0),
               col = "red",
               arrow = arrow(length = unit(0.3, "cm"))) +
  coord_cartesian(ylim = c(0, 0.75), xlim = c(0,50)) +
  theme_void()

arrow_p是在空白背景上创建的,用作叠加层。现在,您可以通过以下方式将其放置在所需位置:

 ggdraw() +
    draw_plot(p) +
    draw_plot(arrow_p, x = 0.10, y = 0.05) +
    draw_plot(arrow_p, x = 0.57, y = 0.05)

enter image description here

不幸的是,您必须在这里反复试验。您还可以更改指定draw_plot()的宽度/高度/比例参数。 也许有更好的方法,但这是一个相当直接的解决方法...