ggplot2:在带状文本上方添加一行

时间:2019-04-10 10:19:00

标签: r ggplot2

我真的很喜欢带状文字上方的线条,就像经济学家在其多面图上所做的一样(在“女性份额,%”以上)。

The economist, faceted plot

我尝试了两种方法,但两种方法都不适合我。

到目前为止我的尝试

1)更换条形背景

我创建了一个grob,在右上角有一条线,并用它替换了带状背景:

gg_red <- ggplot() + theme(plot.background = element_rect("#832301"))

top_line <- gridExtra::grid.arrange(gg_red,
                        layout_matrix  = matrix(c(1, NA, NA, NA), byrow = TRUE, nrow = 2),
                        heights = c(1, 50),
                        widths = c(1,1),
                        padding = 0
                        )

然后我用它替换了地带的背景。

这种工作方式很丑陋

2)在绘制之前格式化facet变量:

我创建了一个函数,在前三个字母上添加了一个小节。

underline_strips <- function(x, nchar = 3){
    first <- x %>% str_sub(end = nchar)
    last <- x %>% str_sub(start = nchar + 1)
    return(paste0("bar('", first, "')*plain('", last,"')")) }

这在一行中表现不错,但是当我将它与str_wrap结合使用时,无论是之前还是之后,结果都非常糟糕。

总的来说,如果ggplot在面板外更加灵活,而无需深入了解网格包,我会喜欢的。无论如何,我将不胜感激任何建议。

1 个答案:

答案 0 :(得分:0)

看看这是否对您有用:

anno_rect <- data.frame(x1 = c(1.3, NA), x2 = c(2, NA), 
                        y1 = c(39, NA), y2 = c(40, NA), 
                        vs = c(0, 1))

anno_line <- data.frame(x1 = c(1.3, 1, 5.7, 5.7),
                        y1 = c(40, 40, 40, 40),
                        vs = c(0, 1, 0, 1))

ggplot(mtcars, aes(x = wt, y = mpg)) + geom_line()  +
  theme(plot.margin = margin(1.2, .5, 0, 0, "cm"),
        legend.position = "none",
        strip.background.x = element_blank(),
        strip.text = element_text(hjust = 0)) +
  coord_cartesian(xlim = c(1.5, 5.5), ylim = c(10, 35), clip = "off") +
  geom_rect(
    data = anno_rect,
    aes(xmin = x1, xmax = x2, ymin = y1, ymax = y2, fill = "red"),
    inherit.aes = FALSE) +
  geom_line(
    data = anno_line,
    aes(x = x1, y = y1, color = "red"),
    inherit.aes = FALSE) +
  annotate("segment", x = 1.3, xend = 1.6, y = 38, yend = 38) +
  facet_wrap(~ vs)

我们正在为注释创建data.frames以绕过facet函数的格式设置。要进行这项工作,必须对页边距和绘图区域进行一些调整。

要使其成为“自动”工具,您将需要通过ggplot_build()从多面图中提取一些参数,并使用它们来填充注释数据,帧和参数以及coord_cartesian()的限制。 / p>

您还可以查看paste(),将___ \n添加到构面标签中。