использование plotmath в метках ggrepel

Я пытаюсь создать график, на котором я хочу показать все коэффициенты из моей линейной модели и их соответствующие статистические данные, прикрепленные в каждой точке с использованием пакета ggrepel. Мне удалось создать базовый сюжет, но я не смог понять, как использовать plotmath при создании меток. Так, например, на графике, приведенном ниже, я хотел бы использовать курсив для значения t (t) и значения p (p). Кроме того, если бы я включил оценки, я бы также захотел включить в метку греческую букву бета (β).

# loading needed libraries
library(ggrepel)
#> Loading required package: ggplot2
library(ggplot2)
library(GGally)
library(tidyverse)

# creating a dataframe containing results
(label_df <- broom::tidy(x = stats::lm(data = mtcars, wt ~ am*cyl), conf.int = TRUE) %>%
  dplyr::filter(.data = ., term != "(Intercept)") %>%
  dplyr::select(.data = ., term, estimate, conf.low, conf.high, statistic, p.value) %>%
  purrrlyr::by_row(
    .d = .,
    ..f = ~ paste(
      "t = ",
      round(.$statistic, digits = 3),
      ", p = ",
      round(.$p.value, digits = 3),
      sep = ""
    ),
    .collate = "rows",
    .to = "label",
    .labels = TRUE
  )
)
#> # tibble [3 x 7]
#>   term   estimate conf.low conf.high statistic  p.value label             
#>   <chr>     <dbl>    <dbl>     <dbl>     <dbl>    <dbl> <chr>             
#> 1 am      -0.956    -2.58      0.668    -1.21  0.238    t = -1.206, p = 0~
#> 2 cyl      0.304     0.135     0.473     3.68  0.000989 t = 3.678, p = 0.~
#> 3 am:cyl   0.0328   -0.234     0.300     0.252 0.803    t = 0.252, p = 0.~

# creating the model coefficient plot using ggcoef
plot <- GGally::ggcoef(x = stats::lm(data = mtcars, wt ~ am*cyl), exclude_intercept = TRUE)

# adding labels using ggrepel
plot +
  ggrepel::geom_label_repel(
    data = label_df,
    mapping = ggplot2::aes(x = estimate, y = term, label = label),
    size = 3,
    box.padding = grid::unit(x = 0.75, units = "lines"),
    fontface = "bold",
    direction = "y",
    color = "black",
    label.size = 0.25,
    segment.color = "black",
    segment.size = 0.5,
    segment.alpha = NULL,
    min.segment.length = 0.5,
    max.iter = 2000,
    point.padding = 0.5,
    force = 2,
    na.rm = TRUE
  )

Если я использую что-то вроде base::substitute или base::bquote для создания метки внутри purrrlyr, я получаю следующую ошибку:

.f должен возвращать либо кадры данных, либо векторы для сортировки без списков

Я могу избавиться от этой ошибки, преобразовав ее в символьный тип, но тогда все метки перепутались.

# creating a dataframe containing results
(label_df <- broom::tidy(x = stats::lm(data = mtcars, wt ~ am*cyl), conf.int = TRUE) %>%
  dplyr::filter(.data = ., term != "(Intercept)") %>%
  dplyr::select(.data = ., term, estimate, conf.low, conf.high, statistic, p.value) %>%
  purrrlyr::by_row(
    .d = .,
    ..f = ~ as.character(bquote(
      "t = "~.(round(.$statistic, digits = 3))~
        ", p = "~
        .(round(.$p.value, digits = 3))
    )),
    .collate = "rows",
    .to = "label",
    .labels = TRUE
  )
)
#> # tibble [9 x 8]
#>   term   estimate conf.low conf.high statistic  p.value  .row label       
#>   <chr>     <dbl>    <dbl>     <dbl>     <dbl>    <dbl> <int> <chr>       
#> 1 am      -0.956    -2.58      0.668    -1.21  0.238        1 ~           
#> 2 am      -0.956    -2.58      0.668    -1.21  0.238        1 "\"t = \" ~~
#> 3 am      -0.956    -2.58      0.668    -1.21  0.238        1 0.238       
#> 4 cyl      0.304     0.135     0.473     3.68  0.000989     2 ~           
#> 5 cyl      0.304     0.135     0.473     3.68  0.000989     2 "\"t = \" ~~
#> 6 cyl      0.304     0.135     0.473     3.68  0.000989     2 0.001       
#> 7 am:cyl   0.0328   -0.234     0.300     0.252 0.803        3 ~           
#> 8 am:cyl   0.0328   -0.234     0.300     0.252 0.803        3 "\"t = \" ~~
#> 9 am:cyl   0.0328   -0.234     0.300     0.252 0.803        3 0.803

Создано 13 июня 2018 г. пакетом REPEX (v0.2.0).


person Indrajeet Patil    schedule 13.06.2018    source источник
comment
Я пробовал, но у меня это не сработало. Я получаю следующую ошибку: Error in parse(text = as.character(lab)) : <text>:1:13: unexpected '=' 1: italic('t')~=, если я изменяю "t = " в коде aove на "italic('t')~=~" и устанавливаю parse = TRUE.   -  person Indrajeet Patil    schedule 16.06.2018
comment
Вы можете посмотреть, что я сделал здесь, чтобы убедиться, что это похоже: stackoverflow.com/a/50768373/2461552   -  person aosmith    schedule 16.06.2018


Ответы (1)


Основываясь на обсуждениях в комментариях, вам необходимо правильно использовать математические аннотации, чтобы избежать ошибок, см. ссылка.

Приведенный ниже формат метки мне подходит и включает бета-оценки с греческим символом. list необходим для получения запятых в plotmath.

(label_df <- broom::tidy(x = stats::lm(data = mtcars, wt ~ am*cyl), conf.int = TRUE) %>%
    dplyr::filter(.data = ., term != "(Intercept)") %>%
    dplyr::select(.data = ., term, estimate, conf.low, conf.high, statistic, p.value) %>%
    purrrlyr::by_row(
      .d = .,
      ..f = ~ paste(
        "list(italic(t)==",
        round(.$statistic, digits = 3),
        ", ~italic(p)==",
        round(.$p.value, digits = 3),
        ", ~beta==",
        round(.$estimate, digits = 3),
        ")",
        sep = ""
      ),
      .collate = "rows",
      .to = "label",
      .labels = TRUE
    )
)

введите описание изображения здесь

person Divi    schedule 18.06.2018