如何在ggplot2中的x轴下添加注释?

时间:2015-06-26 17:47:19

标签: r ggplot2

我有以下图表:

library(ggplot2)
library(scales)
library(magrittr)
df1 <-
  structure(
    list(
      x = structure(
        1:5, .Label = c("5", "4", "3", "2",
                        "1"), class = "factor"
      ), y = c(
        0.166666666666667, 0.361111111111111,
        0.0833333333333333, 0.222222222222222, 0.291666666666667
      )
    ), .Names = c("x",
                  "y"), row.names = c(NA,-5L), class = c("tbl_df", "tbl", "data.frame"), drop = TRUE
  )

df1 %>% ggplot(aes(x , y )) + geom_bar(stat = "identity") +
  scale_y_continuous(labels = percent) 

我想在5和1下面添加带有粗体文字的两行注释。例如,&#39;最高\ n值&#39;低于5和最低\ n值&#39;低于1.

我尝试geom_text,但我无法将文字放在我想要的地方。

2 个答案:

答案 0 :(得分:16)

可以使用annotation_custom()完成此操作。我来自this answer

难点在于ggplot剪辑放置在绘图区域之外的注释,这是您想要做的。但是可以关闭裁剪。

annotation_custom()使用grobs,因此您首先需要创建它们:

library(grid)
text_high <- textGrob("Highest\nvalue", gp=gpar(fontsize=13, fontface="bold"))
text_low <- textGrob("Lowest\nvalue", gp=gpar(fontsize=13, fontface="bold"))

接下来,设置绘图并存储它:

p <-
df1 %>% ggplot(aes(x , y )) + geom_bar(stat = "identity") +
   scale_y_continuous(labels = percent) +
   theme(plot.margin = unit(c(1,1,2,1), "lines")) +
   annotation_custom(text_high,xmin=1,xmax=1,ymin=-0.07,ymax=-0.07) + 
   annotation_custom(text_low,xmin=5,xmax=5,ymin=-0.07,ymax=-0.07)

第三行确保标签下方有足够的空间用于标签,最后两行添加注释。该位置以两个坐标的最小值和最大值给出。 grob将在由这些坐标定义的区域中居中。在目前的情况下,通过设置相同的最小值和最大值来简单地定义点似乎是最容易的。

最后一步是关闭剪裁,以便绘制绘图区域外的对象(即注释)。对于ggplot2 3.0.0及更新版本,可以使用coord_cartesian()完成此操作(请参阅answer by tfad334):

p + coord_cartesian(clip = "off")

对于旧版本的ggplot2,程序稍微复杂一些:

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)

最后一行描绘了情节。

enter image description here

答案 1 :(得分:6)

ggplot2版本3.0.0中,您不需要gtable即可关闭Stibu的答案。使用coord_cartesian()可以实现相同的目的:

library(gridExtra)
df1 %>% ggplot(aes(x , y )) + geom_bar(stat = "identity")+
scale_y_continuous(labels = percent)+
theme(plot.margin = unit(c(1,1,2,1), "lines")) +
annotation_custom(text_high,xmin=1,xmax=1,ymin=-0.07,ymax=-0.07) + 
annotation_custom(text_low,xmin=5,xmax=5,ymin=-0.07,ymax=-0.07)+
coord_cartesian(ylim=c(0,0.35), clip="off")