我正试着把箭头画在图的外面.我try 了许多不同的选项,但他们一直在图中绘制箭头.有没有办法把它画在边界框之外?

set.seed(57)
discharge <- data.frame(date = seq(as.Date("2011-01-01"), as.Date("2011-12-31"), by="days"),
discharge = rexp(365))

test <- ggplot(discharge) +
geom_line(aes(x = date, y = discharge)) +
geom_hline(yintercept = 5.5, linetype= "dashed", color = "red") + 
geom_text(aes(x = date[13], y = 5.5, label = "High"))

(test + annotate(geom = "segment", x = as.Date("2011-01-01"), 
              y = -1, xend = as.Date("2011-01-01"), yend = 0, 
              arrow = arrow(length = unit(3, "mm")), color = "red"))

推荐答案

ggplot2 >= 3.5.0(!)引入的一项很好的功能是,现在可以将注释作为数字放置在打印面板的相对单位中(请参见here).为此,我们必须将annotate内的位置包装为I().这样做的好处是,添加注释不会影响比例范围.

此外,像往常一样,我们必须在coord_cartesian中设置clip="off",并在绘图面板外腾出一些空间,例如通孔plot.margin.

set.seed(57)
discharge <- data.frame(
  date = seq(as.Date("2011-01-01"), as.Date("2011-12-31"), by = "days"),
  discharge = rexp(365)
)

library(ggplot2)

packageVersion("ggplot2")
#> [1] '3.5.0'

test <- ggplot(discharge) +
  geom_line(aes(x = date, y = discharge)) +
  geom_hline(yintercept = 5.5, linetype = "dashed", color = "red") +
  geom_text(data = ~.x[13, , drop = FALSE], aes(x = date, y = 5.5, label = "High"))

test + 
  annotate(
    geom = "segment", x = as.Date("2011-01-01"),
    y = I(-.125), xend = as.Date("2011-01-01"), yend = I(-.05),
    arrow = arrow(length = unit(3, "mm")), color = "red"
  ) +
  coord_cartesian(clip = "off") +
  theme(plot.margin = margin(5.5, 5.5, 22, 5.5))

R相关问答推荐

如何使用geom_sf在边界显示两种 colored颜色 ?

根据收件箱中的特定值提取列名

根据选中三个复选框中的一个或两个来调整绘图

如何编辑ggplot的图例字使用自定义对象(gtable)?'

将非重复序列高效转换为长格式

然后根据不同的列值有条件地执行函数

根据日期从参考帧中创建不同的帧

如何在所有绘图中保持条件值的 colored颜色 相同?

如何读取CSV的特定列时,给定标题作为向量

如何通过判断数据框的一列来压缩另一列?

用R ggplot2求上、下三角形中两个变量的矩阵热图

R:如果为NA,则根据条件,使用列名模式将缺少的值替换为另一列中的值

仅当后续值与特定值匹配时,才在列中回填Nas

循环遍历多个变量,并将每个变量插入函数R

生存时间序列的逻辑检验

我已经运行了几个月的代码的`Palette()`中出现了新的gglot错误

我怎么才能把一盘棋变成一盘棋呢?

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

将`magick`对象转换为原始向量

如何使用包含要子集的值的列表或数据框来子集多个列?