gpt4 book ai didi

r - ggrepel:结合使用 position_dodge 和 geom_label_repel

转载 作者:行者123 更新时间:2023-12-01 05:51:42 26 4
gpt4 key购买 nike

我试图在 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))

Resulting plot

有没有办法使用ggrepel使标签指向伴随的点?

最佳答案

你可以试试这个:

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)

result

说明:
  • geom_label_repel()的数据源按照aosmith的建议添加B-A组合,填充0对于 x(任何数字都可以,只要它不是默认的 NA)和 ""为 rowname (ggrepel 不会绘制空标签,但会在躲避时考虑它们)。
  • box.padding设置为 1(从默认值 0.25 增加)以将标签推得更远,从而使线段更加可见。
  • min.segment.length设置为 0(从默认值 0.5 减少)以强制绘制线段,无论它们有多短。

  • ( show.legend = FALSE 是可选的。我只是不喜欢看到“a”字母出现在图例中。)

    关于r - ggrepel:结合使用 position_dodge 和 geom_label_repel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53377299/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com