我有以下图表:
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
,但我无法将文字放在我想要的地方。
答案 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)
最后一行描绘了情节。
答案 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")