【问题标题】:ggrepel: using position_dodge in combination with geom_label_repelggrepel:结合使用 position_dodge 和 geom_label_repel
【发布时间】:2018-11-19 14:58:58
【问题描述】:

我正在尝试使用ggrepel::geom_label_repel 标记geom_boxplot 中的异常值。当只有一个分组变量时它工作得很好,但是当我尝试多个分组变量时我遇到了问题。出于某种原因,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 使标签指向随附的点?

【问题讨论】:

  • 我认为至少部分问题与没有 B (g1) A (g2) 异常值有关。您可以通过在. %&gt;% filter(outlier) %&gt;% group_by(g1) %&gt;% complete(g2) 中添加该组合来躲避。但是,这并不能解决使用 ggrepel 绘制线条的问题。

标签: r ggplot2 ggrepel


【解决方案1】:

你可以试试这个:

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)

解释:

  1. geom_label_repel() 的数据源遵循 aosmith 的建议添加 B-A 组合,为 x 填充 0(任何数字都可以,只要它不是默认的 NA)和 "" 用于行名( ggrepel 不会绘制空标签,但在躲避时将它们考虑在内)。

  2. box.padding 设置为 1(从默认值 0.25 增加)以将标签推得更远,从而使线段更明显。

  3. min.segment.length 设置为 0(从默认的 0.5 减小)以强制绘制线段,无论它们有多短。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多