Skip to main content
AI in Production 2026 is now open for talk proposals.
Share insights that help teams build, scale, and maintain stronger AI systems.
items
Menu
  • About
    • Overview 
    • Join Us  
    • Community 
    • Contact 
  • Training
    • Overview 
    • Course Catalogue 
    • Public Courses 
  • Posit
    • Overview 
    • License Resale 
    • Managed Services 
    • Health Check 
  • Data Science
    • Overview 
    • Visualisation & Dashboards 
    • Open-source Data Science 
    • Data Science as a Service 
    • Gallery 
  • Engineering
    • Overview 
    • Cloud Solutions 
    • Enterprise Applications 
  • Our Work
    • Blog 
    • Case Studies 
    • R Package Validation 
    • diffify  

Styling {ggplot2} Graphics

Author: Colin Gillespie

Published: August 21, 2018

tags: r, graphics, ggplot2

Styling {ggplot2} graphics

In our previous post, we demonstrated that contrary to popular opinion, it is possible to generate attractive looking plots using just base graphics. Although we did confess, that it did take a lot of time and effort. In this post, we repeat the same exercise. Using the dreaded iris data set, we’ll first create the default {ggplot2} graph, before applying a bit of care and attention.

The standard ggplot version

The standard scatter plot is straightforward to create. Load the package

library("ggplot2")

Then create a scatter plot with the wonderful grey background

## ggplot2 even spells colour correctly ;)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(colour = Species))

Unlike the base R offering, the list of possible improvements to this plot is pleasingly short. Basically, it’s

  • the axis labels (but they come from our column headings)
  • colours (red & blue aren’t the best combination)

So overall, pretty good. Other aspects that could be improved are

  • grey background
  • direct labels on the points
  • starting the x-axis at 4, not 4.2

Do you use Professional Posit Products? If so, check out our managed Posit services

Styling the plot using only {ggplot2}

Using only {ggplot2} (and a little bit of {dplyr} love), we can improve significantly and easily improve the graph. First, we’ll capitalise the legend key. I find it easier to manipulate the data directly,

library("dplyr")
iris = mutate(iris, Species = stringr::str_to_title(Species))

With the data tweaked, we can get to the serious business of styling the plot. As the plot will contain a number of components it makes sense to create intermediate objects. As the points overlap, we’ll change from geom_point(), to geom_jitter(). This geom wiggles the points and allow us to see overlapping points:

g = ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_jitter(aes(colour = Species)) +
  xlab("Sepal length") + ylab("Sepal width") + # Improve axis labels
  ggtitle("The infamous Iris plot") # Title
g

The changes we’ve made so far would impossible for any package to do for us - how would the package know the plot title? We can now improve the look and feel of the plot. There are two ways of complementary ways of doing this: scales and themes. The ggplot scales control things like colours and point size. In the latest version of {ggplot2}, version 3.0.0, the Viridis colour palette was introduced. This palette is particularly useful for creating colour-blind friendly palettes

g + scale_colour_viridis_d() # d for discrete

The theme controls elements such as grid lines, fonts, labels. I’m partial to theme_minimal()

g + scale_colour_viridis_d() +
  theme_minimal()

The hrbrthemes package

We don’t just have to use the themes that come with {ggplot2}, we can use themes provided by other packages. The {hrbrthemes} package contains a nice theme called ipsum that’s similar to the minimal theme, but also tweaks the font and sub-headings. There is also an associated colour scheme called scale_colour_ipsum()`. An additional improvement we’ll make, is to drop the legend and place the text directly on the chart. After loading the package

library("hrbrthemes")

we create a data frame with the label positions

labels = data.frame(x = c(5, 5.3, 7), y = c(4.2, 2.1, 3.7),
                    Species = c("Setosa", "Versicolor", "Virginica"))

We construct the plot as usual

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_jitter(aes(colour = Species)) +
  theme_ipsum() +
  labs(x = "Sepal length", y="Sepal width",
       title = "The infamous Iris data set",
       subtitle = "Thanks @hrbrmstr for the theme",
       caption = "jumpingrivers.com") +
  scale_colour_ipsum(guide = FALSE) +
  geom_text(data = labels, aes(x, y, label = Species, colour = Species)) +
  xlim(c(4, 8))

Notice we can add data from two data sets onto a ggplot with relative ease.

Thanks for reading, see you next time!


Jumping Rivers Logo

Recent Posts

  • Start 2026 Ahead of the Curve: Boost Your Career with Jumping Rivers Training 
  • Should I Use Figma Design for Dashboard Prototyping? 
  • Announcing AI in Production 2026: A New Conference for AI and ML Practitioners 
  • Elevate Your Skills and Boost Your Career – Free Jumping Rivers Webinar on 20th November! 
  • Get Involved in the Data Science Community at our Free Meetups 
  • Polars and Pandas - Working with the Data-Frame 
  • Highlights from Shiny in Production (2025) 
  • Elevate Your Data Skills with Jumping Rivers Training 
  • Creating a Python Package with Poetry for Beginners Part2 
  • What's new for Python in 2025? 

Top Tags

  • R (236) 
  • Rbloggers (182) 
  • Pybloggers (89) 
  • Python (89) 
  • Shiny (63) 
  • Events (26) 
  • Training (23) 
  • Machine Learning (22) 
  • Conferences (20) 
  • Tidyverse (17) 
  • Statistics (14) 
  • Packages (13) 

Authors

  • Amieroh Abrahams 
  • Shane Halloran 
  • Russ Hyde 
  • Myles Mitchell 
  • Tim Brock 
  • Theo Roe 
  • Colin Gillespie 
  • Aida Gjoka 
  • Gigi Kenneth 
  • Osheen MacOscar 
  • Sebastian Mellor 
  • Keith Newman 
  • Pedro Silva 

Keep Updated

Like data science? R? Python? Stan? Then you’ll love the Jumping Rivers newsletter. The perks of being part of the Jumping Rivers family are:

  • Be the first to know about our latest courses and conferences.
  • Get discounts on the latest courses.
  • Read news on the latest techniques with the Jumping Rivers blog.

We keep your data secure and will never share your details. By subscribing, you agree to our privacy policy.

Follow Us

  • GitHub
  • Bluesky
  • LinkedIn
  • YouTube
  • Eventbrite

Find Us

The Catalyst Newcastle Helix Newcastle, NE4 5TG
Get directions

Contact Us

  • hello@jumpingrivers.com
  • + 44(0) 191 432 4340

Newsletter

Sign up

Events

  • North East Data Scientists Meetup
  • Leeds Data Science Meetup
  • Shiny in Production
British Assessment Bureau, UKAS Certified logo for ISO 9001 - Quality management British Assessment Bureau, UKAS Certified logo for ISO 27001 - Information security management Cyber Essentials Certified Plus badge
  • Privacy Notice
  • |
  • Booking Terms

©2016 - present. Jumping Rivers Ltd