8

I want to add an image or svg to the ggplot title.

enter image description here

This is what I'm aiming for:

enter image description here

get the eye "here"

Below is my best try.

I'm unhappy with it because I have to try and error a lot to get it into the right position. not really a general solution.

library(ggplot2)
library(raster)
library(grid)

img1 <- as.matrix(raster(system.file("external/rlogo.grd", package="raster")))
img1[img1>128] <- NA
img1[img1>0] <- 0
image(img1)

g1 <- rasterGrob(img1, interpolate=TRUE)

p <- ggplot(mtcars, aes(wt, mpg)) +
  geom_point() + 
  ggtitle("       <- dat rLogo tho") +
  annotation_custom(g1,xmin = 1.2,1.6,35.5,38)

gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)


  
2
  • Could you try the emojifont package? Commented Apr 18, 2017 at 14:18
  • that was a good idea. but 1. wont work on me. "In grid.Call.graphics(L_text, as.graphicsAnnot(x$label), x$x, x$y, : invalid input 'ðŸ˜' in 'utf8towcs'". 2. emojis are too funny. i need serious eyes Commented Apr 18, 2017 at 15:05

1 Answer 1

5

Here's my attempt using the very serious-looking eye png:

library(ggplot2)
library(grid)
library(dplyr)
library(gtable)

eyeImg <- png::readPNG("serious_eye.png") %>%
  rasterGrob(interpolate = TRUE)

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  ggtitle("") # to create space for title

# convert to grob
gt <- ggplotGrob(p)

# create new title as a tableGrob with separate cells for image & text
new.title <- gtable(widths = grobWidth(gt),
       heights = grobHeight(gt)) %>%
  gtable_add_grob(grobs = eyeImg, t = 1, l = 1) %>%
  gtable_add_cols(widths = unit(1, "null")) %>%
  gtable_add_grob(textGrob(label = "<- very serious eye",
                           x = unit(0, "npc"), just = "left"),
                  t = 1, l = 2) %>%
  # optional: adda fixed amt of space between image & text
  gtable_add_col_space(width = unit(5, "pt")) 

# dev.off(); grid.draw(new.title)

# assign new title back to gt
gt$grobs[[which(gt$layout$name == "title")]] <- new.title

grid.draw(gt)

plot

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.