我正在尝试使用geom_boxplot来标记ggrepel::geom_label_repel中的异常值。当只有一个分组变量时,它很好地工作,但是当我尝试多个分组变量时,我遇到了一个问题。ggrepel中的立场论点由于某些原因似乎不太一致,请参见下面的示例:
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指向所附的点?
发布于 2019-01-16 06:30:59
你可以试试这个:
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的建议,添加but组合,为x填充0 (只要它不是默认的NA)和行名的"" (ggrepel不会绘制空标签,但在躲避时会考虑到它们)。box.padding设置为1(从默认的0.25增加),以进一步推开标签,从而使线段更加可见。min.segment.length设置为0(从默认的0.5降为0),以强制绘制线段,不管它们有多短。(show.legend = FALSE是可选的。我只是不喜欢看到传说中出现的“一个”字母。
https://stackoverflow.com/questions/53377299
复制相似问题