A custom radar chart to explore the palmerpenguins dataset made with
ggradar. This blogpost guides you
through a step-by-step construction of a radar chart that includes a
variety of custom labels, annotations, and guides.
This page showcases the work of
Tuo Wang that introduces
packages to make
plots more beautiful. You can find the original code on Tuo’s blog
Thanks to him for accepting sharing his work here! Thanks also to Tomás Capretto who split the original code into this step-by-step guide! 🙏🙏
Let’s start by loading the packages needed to build the figure.
ggradar is the
star of the day. This package does only one thing, but it does it
very well. Thanks to it, making
ggplot2 based radar
charts is extremely easy.
ggradar can be installed from
library(ggradar) library(palmerpenguins) library(tidyverse) library(scales) library(showtext)
font_add_google() to download fonts. The second
argument is an (optional) alias that will be used throughout the
font_add_google("Lobster Two", "lobstertwo") font_add_google("Roboto", "roboto") # Showtext will be automatically invoked when needed showtext_auto()
Another option would be to use the
ragg library for
the backend. With
ragg, all the fonts installed in your
computer are available can be used to build charts without having to
Today’s data were collected and made available by
Dr. Kristen Gorman
Palmer Station, Antarctica LTER, a member of the
Long Term Ecological Research Network. This dataset was popularized by
Allison Horst in her R
with the goal to offer an alternative to the iris dataset for data
exploration and visualization.
data("penguins", package = "palmerpenguins") head(penguins, 3)
After dropping observations with missing values, it’s necessary to
compute the mean value for the numerical variables that will be
displayed in the radar chart. Then, with the aid of the
rescale() function from the
these summaries are rescaled to the [0, 1] interval.
<- penguins %>% penguins_radar drop_na() %>% group_by(species) %>% summarise( avg_bill_length = mean(bill_length_mm), avg_bill_dept = mean(bill_depth_mm), avg_flipper_length = mean(flipper_length_mm), avg_body_mass = mean(body_mass_g) %>% ) ungroup() %>% mutate_at(vars(-species), rescale)
Creating a radar chart with
ggradar is as easy as
ggradar(data). In this case, the pipe operator
%>% is used to pass the data frame to the function.
<- penguins_radar %>% plt ggradar( font.radar = "roboto", grid.label.size = 13, # Affects the grid annotations (0%, 50%, etc.) axis.label.size = 8.5, # Afftects the names of the variables group.point.size = 3 # Simply the size of the point )
Can we make it better than that? Of course! Let’s keep working on it.
The chart above has nice default colors and axis guides, that’s great for such a few lines of code!
The next step is to make it prettier. Let’s get started by fixing the overlap in the legend and making some adjustments.
# 1. Set the position legend to bottom-right # 2. Bottom-right justification # 3. Customize text size and family # 4. Remove background and border color for the keys # 5. Remove legend background <- plt + plt theme( legend.position = c(1, 0), legend.justification = c(1, 0), legend.text = element_text(size = 28, family = "roboto"), legend.key = element_rect(fill = NA, color = NA), legend.background = element_blank() )
Very nice! It’s amazing what can be done with just two small chunks of code.
The chart above is pretty close from being publication ready. What’s needed now is a good title and final touches to the layout:
# * The panel is the drawing region, contained within the plot region. # panel.background refers to the plotting area # plot.background refers to the entire plot <- plt + plt labs(title = "Radar plot of penguins species") + theme( plot.background = element_rect(fill = "#fbf9f4", color = "#fbf9f4"), panel.background = element_rect(fill = "#fbf9f4", color = "#fbf9f4"), plot.title.position = "plot", # slightly different from default plot.title = element_text( family = "lobstertwo", size = 62, face = "bold", color = "#2a475e" ) )
And finally, save the result.
ggsave( filename = here::here("img", "fromTheWeb", "web-radar-chart-with-R.png"), plot = plt, width = 5.7, height = 5, device = "png" )