How can I add a logo to a ggplot visualisation?
Asked Answered
C

2

9

I'm currently working on a ggplot column chart and I'm trying to add a logo to the bottom right. This is the code to the chart:

df <- data.frame(Names = c("2001", "2004", "2008", "2012", "2018"),
                  Value = c(47053, 68117, 171535, 241214, 234365))

p <- ggplot(df, aes(x = Names, y = Value)) + 
              geom_col(fill = "#DB4D43") + theme_classic() +
              geom_text(aes(label =  Value, y = Value + 0.05), 
                        position = position_dodge(0.9), 
                        vjust = 0)

I followed this tutorial I found online, but for some reason, it won't let me adjust the size of the logo and it ends up looking too small no matter what I type on the image_scale function.

img <- image_read("Logo.png")
img <- image_scale(img,"200")
img <- image_scale(img, "x200")
g <- rasterGrob(img)

size = unit(4, "cm")

heights = unit.c(unit(1, "npc") - size,size)
widths = unit.c(unit(1, "npc") - size, size)
lo = grid.layout(2, 2, widths = widths, heights = heights)

grid.show.layout(lo)

grid.newpage()
pushViewport(viewport(layout = lo))

pushViewport(viewport(layout.pos.row=1:1, layout.pos.col = 1:2))
print(p, newpage=FALSE)
popViewport()

pushViewport(viewport(layout.pos.row=2:2, layout.pos.col = 2:2))
print(grid.draw(g), newpage=FALSE)
popViewport()

g = grid.grab()

grid.newpage()
grid.draw(g)

rm(list=ls())

I found another tutorial and, after trying this, it doesn't show anything at all when I run it.

mypng <- readPNG('Logo.png')
print(mypng)

logocomp <- p + annotation_raster(mypng, ymin = 4.5,ymax= 5,xmin = 30,xmax = 35)
Christos answered 16/8, 2020 at 23:43 Comment(1)
Welcome to stack overflow. A good suggestion would be to add the link for the tutorials you were trying to follow.Phosphorate
D
5

You could use the cowplot package to easily add an image to any plot made with ggplot. I used the R logo as the image that needs to be added to the plot (using magick package to read it). One advantage of using cowplot is that you can easily specify the size and position of both the plot and the image.

library(cowplot)
library(magick)

img <- image_read("Logo.png")

# Set the canvas where you are going to draw the plot and the image
ggdraw() +
  # Draw the plot in the canvas setting the x and y positions, which go from 0,0
  # (lower left corner) to 1,1 (upper right corner) and set the width and height of
  # the plot. It's advisable that x + width = 1 and y + height = 1, to avoid clipping 
  # the plot
  draw_plot(p,x = 0, y = 0.15, width = 1, height = 0.85) +
  # Draw image in the canvas using the same concept as for the plot. Might need to 
  # play with the x, y, width and height values to obtain the desired result
  draw_image(img,x = 0.85, y = 0.02, width = 0.15, height = 0.15)  

Plot with image

Desorb answered 17/8, 2020 at 0:29 Comment(0)
O
0

Try using grid.raster, something like:

grid::grid.raster(img, x = 0.15, y = 0.05, width = unit(0.5, 'inches'))

x and y to define location of the image. Adjust the number in unit() to resize the plot.

Oblique answered 17/8, 2020 at 0:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.