【发布时间】:2019-05-07 19:03:20
【问题描述】:
我正在制作一个类似于坡度图的图表,我想在其中的一侧或两侧放置标签,并留出足够的空白空间以适应它们的两侧。在标签很长的情况下,我使用stringr::str_wrap 将它们包裹起来以放置换行符。为了防止标签重叠,我将ggrepel::geom_text_repel 与direction = "y" 一起使用,因此x 位置是稳定的,但y 位置相互排斥。我还有 hjust = "outward" 将左侧文本与右端对齐,反之亦然。
然而,排斥定位似乎将标签的边界框放置在hjust = "outward",但文本在该标签具有hjust = 0.5,即文本在其边界内居中。到现在为止,我从未注意到这一点,但是使用包裹标签时,第二行居中很尴尬,而我希望看到两行都左对齐或右对齐。
这是一个基于 mpg 数据集构建的示例。
library(ggplot2)
library(dplyr)
library(ggrepel)
df <- structure(list(long_lbl = c("chevrolet, k1500 tahoe 4wd, auto(l4)",
"chevrolet, k1500 tahoe 4wd, auto(l4)", "subaru, forester awd, manual(m5)",
"subaru, forester awd, manual(m5)", "toyota, camry, manual(m5)",
"toyota, camry, manual(m5)", "toyota, toyota tacoma 4wd, manual(m5)",
"toyota, toyota tacoma 4wd, manual(m5)", "volkswagen, jetta, manual(m5)",
"volkswagen, jetta, manual(m5)"), year = c(1999L, 2008L, 1999L,
2008L, 1999L, 2008L, 1999L, 2008L, 1999L, 2008L), mean_cty = c(11,
14, 18, 20, 21, 21, 15, 17, 33, 21)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -10L))
df_wrap <- df %>%
mutate(wrap_lbl = stringr::str_wrap(long_lbl, width = 25))
ggplot(df_wrap, aes(x = year, y = mean_cty, group = long_lbl)) +
geom_line() +
geom_text_repel(aes(label = wrap_lbl),
direction = "y", hjust = "outward", seed = 57, min.segment.length = 100) +
scale_x_continuous(expand = expand_scale(add = 10))
hjust 的其他值也会发生同样的情况。查看函数的source,我看到了指向这个问题的一行:
hjust = x$data$hjust %||% 0.5,
如果x$data$hjust 为空,则%||% 分配0.5。据我了解,但似乎我设置的hjust 并没有延续到这个位置,而是变为空。
我错过了什么吗?谁能在不重新实现整个算法的情况下看到我可以在哪里覆盖它?还是这里有错误导致我的hjust 丢失?
【问题讨论】: