Нарисуйте метки с разделенными нормальным и курсивным шрифтом на графике Эйлера (eulerr)

Библиотека eulerr создает график со следующим кодом:

library(tidyverse)
library(eulerr)

matrix(data = c(T,T,T,F,T,F,T,F,T,T,T,F,F,F,T), ncol=3) %>%
  venn %>%
  plot(
    labels = c(
      "Left",
      "Right",
      "Oh, right"),
    main = expression("Oh,"~italic("right"))
       )

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

Мне нужно, чтобы в метках был курсив, но только частично. Я бы хотел, чтобы третья метка была отформатирована как заголовок: О, правильно.

Я пробовал различные перестановки paste, expression, bquote, substitute, устанавливая label =, но безрезультатно.

Идеи?


person steve_b    schedule 28.10.2020    source источник


Ответы (1)


Вы можете попробовать использовать getGrob и setGrob для замены текста после создания графика диаграммы Венна.

library(eulerr)

mat <- matrix(data = c(T,T,T,F,T,F,T,F,T,T,T,F,F,F,T), ncol=3)

v <- venn(mat)

p <- plot(v,
  labels = c(
    "Left",
    "Right",
    "Oh, right"),
  main = expression("Oh,"~italic("right"))
)

p

gg <- getGrob(p, "tag.label.3")
gg[[1]] <- expression(bold("Oh,"~bolditalic("yes!")))
setGrob(p, "tag.label.3", gg)

сюжет Венна с измененной меткой

Редактировать: чтобы найти гроб, который необходимо отредактировать, вы можете использовать что-то вроде grid.ls:

library(grid)

grid.ls(p)

Это перечислит имена grobs на вашем участке, включая tag.label.3:

euler.diagram
  main.grob
  canvas.grob
    diagram.grob.1
      fills.grob.1
      fills.grob.2
      fills.grob.3
      fills.grob.4
      fills.grob.5
      fills.grob.6
      fills.grob.7
      edges.grob
      tags
        tag.number.1
          tag.label.1
          tag.quantity.1
        tag.number.2
          tag.label.2
          tag.quantity.2
        tag.number.3
          tag.label.3
          tag.quantity.3
        tag.number.4
          GRID.null.1
          tag.quantity.4
        tag.number.5
          GRID.null.2
          tag.quantity.5
        tag.number.6
          GRID.null.3
          tag.quantity.6
        tag.number.7
          GRID.null.4
          tag.quantity.7

Методом проб/ошибок я обнаружил, что tag.label.3 был искомым текстом.

Кроме того, глядя на пакет eulerr, у вас есть:

# from tag-grobs.R in eulerr package
labels_grob <- textGrob(
  label,
  x = unit(x, "native"),
  y = unit(y, "native"),
  rot = labels$rot[data$labels_par_id],
  gp = labels$gp[data$labels_par_id],
  name = paste0("tag.label.", data$labels_par_id)
)

Где tag.label. используется в качестве префикса для текстовых меток.

person Ben    schedule 30.10.2020
comment
Я принял это, но было бы хорошо, если бы вы могли расширить свой ответ, чтобы объяснить присоединение части tag.label.. Как вы узнали, как идентифицировать или получить доступ к этому атрибуту именно по этому имени? - person steve_b; 05.11.2020
comment
@steve_b Мои извинения, я должен был добавить больше объяснений. Я признаю, что это потребовало некоторого поиска, в том числе в пакете eulerr. Пожалуйста, смотрите мой отредактированный ответ с более подробной информацией. - person Ben; 05.11.2020
comment
Это очень полезно и информативно, помимо этого конкретного вопроса - спасибо за дополнительную информацию! - person steve_b; 06.11.2020