Add Image to Plot in R (Example) | Draw Picture on Top of Graph Using ggplot2 & patchwork Packages


In this tutorial, I’ll show how to add a picture on top of a ggplot2 plot in the R programming language.

The article consists of this content:

Let’s get started.


Example Data, Add-On Packages & Default Graphic

First, let’s create some example data in R:

data <- data.frame(x = 1:6,         # Creating example data
                   y = 10:5)
data                                # Printing example data
#   x  y
# 1 1 10
# 2 2  9
# 3 3  8
# 4 4  7
# 5 5  6
# 6 6  5

Have a look at the previous output of the RStudio console. It shows that our example data has six rows and two numeric columns x and y.

We need to install and load the ggplot2 package, if we want to use the functions that are contained in the package:

install.packages("ggplot2")         # Install ggplot2 package
library("ggplot2")                  # Load ggplot2 package

Next, we can draw our data in a basic ggplot2 without an image:

ggp <- ggplot(data, aes(x, y)) +    # Create ggplot2 plot
ggp                                 # Draw ggplot2 plot


r graph figure 1 add image


Figure 1 shows the output of the previous syntax – A ggplot2 scatterplot with default specifications and without showing an image on top.

Let’s add an image…


Example: Add Image to Plot Using inset_element() Function of patchwork Package

In this example, I’ll show how to draw a ggplot2 plot with an image on top.

We first need to load an image to R using the png package. For this, we have to install and load the png package first:

install.packages("png")             # Install png package
library("png")                      # Load png package

Now, we can use the readPNG function to load an image that we have stored on our computer:

my_image <- readPNG("C:/Users/Joach/Desktop/r-logo.png", native = TRUE)

If we want to add this image on top of our ggplot2 plot, we have to install and load the patchwork package as well:

install.packages("patchwork")       # Install patchwork package
library("patchwork")                # Load patchwork

Now, we can use the inset_element function to add our picture to our ggplot2 graphic:

ggp_image <- ggp +                  # Combine plot & image
  inset_element(p = my_image,
                left = 0.5,
                bottom = 0.55,
                right = 0.95,
                top = 0.95)
ggp_image                           # Draw combined plot


r graph figure 2 add image


The output of the previous R syntax is shown in Figure 2: A ggplot2 plot and an image on top.


Video & Further Resources

Do you need further information on the R syntax of this post? Then I can recommend to watch the following video of my YouTube channel. I show the R programming codes of this article in the video.


Please accept YouTube cookies to play this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube Content Consent Button Thumbnail

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.


Furthermore, you may have a look at the other articles which I have published on my website. You can find some articles below:


In summary: In this tutorial you learned how to insert and combine plots and images in the same graph in the R programming language. In case you have additional questions, please let me know in the comments below.


Subscribe to the Statistics Globe Newsletter

Get regular updates on the latest tutorials, offers & news at Statistics Globe.
I hate spam & you may opt out anytime: Privacy Policy.

2 Comments. Leave new

  • Koen Venema
    May 9, 2023 8:46 pm

    Hi Joachim,
    Have been following your posts on Twitter for a while now. They are great and really helpful!
    Based on this “Add Image to Plot in R”, I was wondering whether it would also be possible to plot another ggplot-graph (as an inset or something, or perhaps a zoom-in of the bigger plot, just brainstorming here…) on top of a larger ggplot, not as a png, but as a modifiable ggplot…
    Does patchwork allow that too?

    • Hello Koen,

      Yes, it is indeed possible to add another ggplot as an inset to a larger ggplot, and the patchwork package makes this process much simpler. You can create two separate ggplot objects and then add them together using the patchwork syntax. Here’s a simple example:

      # Load necessary packages
      # Create two ggplot objects
      p1 <- ggplot(mtcars, aes(mpg, disp)) +
        geom_point() +
      p2 <- ggplot(mtcars, aes(hp, wt)) +
        geom_point() +
      # Add the plots together
      p1 + inset_element(p2, left = 0.65, bottom = 0.65, right = 0.95, top = 0.95)

      If you want to create a zoom-in of a specific part of the larger plot, you might need to create a second plot that focuses on that specific area. See the following.

      # Create zoomed in plot
      p3 <- ggplot(subset(mtcars, mpg > 15 & mpg < 20 & disp > 200 & disp < 300), aes(mpg, disp)) +
        geom_point() +
      # Add the zoomed in plot as an inset
      p1 + inset_element(p3, left = 0.65, bottom = 0.65, right = 0.95, top = 0.95)

      I hope you find the solutions helpful. Also, thank you for your nice feedback!



Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.