3

The eulerr library produces a plot with the following code:

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"))
       )

enter image description here

I need to have italic font in the labels, but only partially. I would like the third label to be formatted like the title: Oh, right.

I have tried a variety of permutations of paste, expression, bquote, substitute, while setting label = but to no avail.

Ideas?

steve_b
  • 105
  • 6

1 Answers1

1

You could try using getGrob and setGrob to replace the text after the venn diagram plot has been created.

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)

venn plot with changed label

Edit: To find the grob that needs to be edited, you can use something like grid.ls:

library(grid)

grid.ls(p)

This will list the names of grobs in your plot, including 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

By trial/error, I found that tag.label.3 was the desired text.

In addition, looking at the eulerr package, you have:

# 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)
)

Where tag.label. is used as a prefix for the text labels.

Ben
  • 28,684
  • 5
  • 23
  • 45
  • I've accepted this, but it would be good if you could expand your answer to explain the accesion of the `tag.label.` part. How did you know how or identify or access this attribute specifically by that name? – steve_b Nov 05 '20 at 12:02
  • @steve_b My apologies, I should have added more explanation. I admit, this did take some searching, including in the `eulerr` package. Please see my edited answer with more details. – Ben Nov 05 '20 at 12:42
  • 1
    That is super useful and informative beyond this particular question- thanks for the extra detail! – steve_b Nov 06 '20 at 14:33