Radar chart

Macrobond R API is available for users with Data+ and Legacy license (the latter without searching and revision history functions). Examples were tested on Macrobond version 1.27, Macrobond API for R version 1.2-8 and R 4.3.0.

See two methods of constructing radar charts - with ggplot2 + ggradar and fsmb. Examples are presented on Innovation Input Sub-index from Global Innovation Index.

 

Radar chart version 1 created with ggplot2 and ggradar packages (click to enlarge). Jump to code with ggplot2 + ggradar package.

 

 

 


Radar chart version 2 with fmsb package (click to enlarge). Jump to code with fmsb package.

 

With ggplot2 + ggradar

library(MacrobondAPI)
library(tidyverse)
library(countrycode)
library(ggradar)

#First column is the name of the groups and each column represents a variable.
#All columns must have the same scale.
#If the values of your columns are not between 0 and 1 you will need to specify the minimum value with grid.min and the maximum value with grid.max.

#create list of series
list_of_series<-c("gii0828", "gii0974", "gii1266", "gii0682", "gii1120", #Nigeria
                  "gii0849", "gii0995", "gii1287", "gii0703", "gii1141", #South Africa
                  "gii0773", "gii0919", "gii1211", "gii0627", "gii1065") #Ethiopia

#create empty vectors
values<-NULL
region<-NULL

#get region
for (i in list_of_series){
  region<-append(region, getMetadataValues(getMetadata(FetchOneTimeSeries(i)), "Region"))
}
#change region ISO codes to names
region<-countrycode(as.vector(region), origin="iso2c", destination ="country.name")

#set description
description_labels<-c("Human Capital & Research", "Infrastructure", "Business \nSophistication", 
                      "Institutions", "Market \nSophistication")
descriptions<-rep(description_labels, 3) #create this for data frame

#get values 
for (i in list_of_series){
  values<-append(values, last(getValues(FetchOneTimeSeries(i))))
}

#prepare data frame
data <- data.frame(region, descriptions, values)
#change format of data from long to wide
data <- spread(data, descriptions, values)

#set colors
colors <- c("#58A291", "#F68D2E", "#CD545B")

#plot
ggradar(data, 
        values.radar = c(0, 40, 80), #0%, 50%, 100% of values
        axis.labels = c(description_labels), #description of each 'arm'
        grid.min=0,grid.mid=40, grid.max=80, #grid labels
        background.circle.colour = "white", #background settings
        axis.line.colour = "grey", #axis line's settings
        axis.label.size=4,
        gridline.min.colour = "grey", #gridlines' settings
        gridline.mid.colour = "grey",
        gridline.max.colour = "grey",
        grid.label.size=5,
        group.colours = colors, #chart's lines settings
        group.line.width= 1.2,
        group.point.size=5,
        legend.title="Global Innovation Index", #legend's settings
        legend.position = "top", 
        legend.text.size = 10)

With fmsb

library(MacrobondAPI)
library(tidyverse)
library(countrycode)
library(fmsb)

#create list of series
list_of_series<-c("gii0828", "gii0974", "gii1266", "gii0682", "gii1120", #Nigeria
                  "gii0849", "gii0995", "gii1287", "gii0703", "gii1141", #South Africa
                  "gii0773", "gii0919", "gii1211", "gii0627", "gii1065") #Ethiopia

#create empty vectors
values<-NULL
region<-NULL

#get region
for (i in list_of_series){
  region<-append(region, getMetadataValues(getMetadata(FetchOneTimeSeries(i)), "Region"))
}
#change ISO codes to names
region<-countrycode(as.vector(region), origin="iso2c", destination ="country.name")

#set description
description_labels<-c("Human Capital & Research", "Infrastructure", "Business \nSophistication", 
                      "Institutions", "Market \nSophistication")
descriptions<-rep(description_labels, 3) #create this for data frame

#get values 
for (i in list_of_series){
  values<-append(values, last(getValues(FetchOneTimeSeries(i))))
}

#Data frame must have first row representing the maximum values of the data and the second row the minimum values.
#prepare data frame
data <- data.frame(region, descriptions, values)
#prepare data frame for max and min values
max_min <- as.data.frame(rbind(rep(80, 5), rep(0, 5)))
rownames(max_min) <- c("max", "min")
colnames(max_min) <- description_labels
                      
#change format of data from long to wide
data <- spread(data, descriptions, values) %>%
  column_to_rownames(var="region") #move first column to row names
data <- rbind(max_min, data) #join two data frames

#set colors
colors <- c("#58A291", "#F68D2E", "#CD545B")

#plot (mark radar chart and legend to plot them together)
radarchart(data, 
           axistype=1, #gridlines' settings
           cglcol = "gray", 
           axislabcol="grey", 
           caxislabels=c(0,20, 40, 60, 80), 
           pcol = colors, #chart's lines settings
           plty = 1,
           plwd = 2,
           vlcex=0.8, #size of value labels
           title = "Global Innovation Index") 

legend(x=1.3, y=1, #legend's position
       legend = rownames(data[-c(1,2),]), #exclude names for max and min
       bty="n", #border around legend, n=none
       pt.cex=1.8, #width of sample colors
       pch = 20,
       col = colors)