我正在尝试使用geom_boxplot
在ggrepel::geom_label_repel
中标记异常值。当只有一个分组变量时,它很好用,但是当我尝试多个分组变量时,我遇到了问题。由于某些原因,ggrepel中的position参数似乎工作不一致,请参见以下示例:
library(tidyverse)
library(ggrepel)
set.seed(1337)
df <- tibble(x = rnorm(500),
g1 = factor(sample(c('A','B'), 500, replace = TRUE)),
g2 = factor(sample(c('A','B'), 500, replace = TRUE)),
rownames = 1:500)
is_outlier <- function(x) {
return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
df_outliers <- df %>% group_by(g1, g2) %>% mutate(outlier=is_outlier(x))
ggplot(df_outliers, aes(x=g1, y=x, fill=g2)) +
geom_boxplot(width=0.3, position = position_dodge(0.5)) +
ggrepel::geom_label_repel(data=. %>% filter(outlier),
aes(label=rownames), position = position_dodge(0.8))
是否可以使用ggrepel使标签指向随附的点?
答案 0 :(得分:0)
您可以尝试以下方法:
ggplot(df_outliers,
aes(x=g1, y=x, fill=g2, label=rownames)) +
geom_boxplot(width = 0.3, position = position_dodge(0.5)) +
geom_label_repel(data = . %>%
filter(outlier) %>%
group_by(g1) %>%
complete(g2, fill = list(x = 0, rownames = "")),
position = position_dodge(0.5),
box.padding = 1,
min.segment.length = 0,
show.legend = FALSE)
说明:
geom_label_repel()
的数据源遵循aosmith的建议添加BA组合,并为x填充0
(只要不是默认值,NA即可)和{{ 1}}表示行名(ggrepel不会绘制空标签,但在躲避时 会将它们考虑在内)。
""
设置为1(从默认值0.25增加)以将标签推得更远,从而使线段更清晰可见。
box.padding
设置为0(从默认值0.5减少)以强制绘制线段,无论它们的长度如何。
({min.segment.length
是可选的。我只是不喜欢在图例中看到“ a”字母。)