Introduccion

Con ggplot2 es muy sencillo hacer los llamados gráficos de radar, de araña o de Kiviatt.

para ello lo que haremos será hacer una representación y pasarlo a coordenadas polares usando coord_polar. En las coordenadas polares, cada punto viene definido por una distancia respecto al origen y un ángulo respecto a un eje que cruza por dicho origen. La transformación en ggplot2 implica que la coordenada Y se transforma en la distancia respecto al origen y la coordenada X se transforma en el ángulo, aunque se ve mejor si se piensa que es la posición relativa en el círculo concéntrico que le corresponde.

Dataset Mínimo

Con el siguiente código de R vamos a generar un dataset mínimo que poder representar en forma de radar plot.

set.seed(1)  #para que sea reproducible 

df.rad = expand.grid(letters[1:5], 1:2)
df.rad$score = runif(nrow(df.rad))

La función expand.grid genera un data.frame con todas las combinaciones posibles de los factores que les damos. En este caso, las 5 primeras letras del abecedario en minúsculas letters[1:5] = a, b, c, d, e y los números 1 y 2. Luego generamos un vector aleatorio llamado score que es la variable que representaremos.

head(df.rad)
##   Var1 Var2     score
## 1    a    1 0.2655087
## 2    b    1 0.3721239
## 3    c    1 0.5728534
## 4    d    1 0.9082078
## 5    e    1 0.2016819
## 6    a    2 0.8983897

Representación

El código para representar el gráfico es el siguiente:

library(ggplot2)
ggplot(df.rad, aes(x = Var1, y = score, col = Var2, group = Var2)) + geom_point() + geom_line() + coord_polar()

Si os fijais, lo que hace el radial plot es el coord_polar() final, que cambia el sistema de coordenadas de cartesianas a radiales. Sin él, la representación quedaría así:

ggplot(df.rad, aes(x = Var1, y = score, col = Var2, group = Var2)) + geom_point() + geom_line() 

Si necesitais cerrar las líneas, podéis recurrir a la geom_polygon sin rellenar.

ggplot(df.rad, aes(x = Var1, y = score, col = Var2, group = Var2)) + 
  geom_polygon(fill = NA) + coord_polar()

A parte del cambio de coordenadas, se pueden aplicar el resto de transformaciones de ggplot2 como por ejemplo hacer un facet sobre la variable 2.

#Aumentamos el número de factores de la variable 2 primero para que el efecto sea más claro. 
df.rad = expand.grid(letters[1:5], 1:5)
df.rad$score = runif(nrow(df.rad))

ggplot(df.rad, aes(x = Var1, y = score, col = Var2, group = Var2)) + 
  geom_polygon(fill = NA) + coord_polar() + facet_wrap(~Var2)

Otros plots

En realidad, la transformación en coordenadas polares puede aplicarse a cualquier otro plot, por ejemplo, las barplots:

ggplot(data = diamonds, aes(x = cut)) + geom_bar(fill = "lightblue", colour = "black") + coord_polar()

ggplot(data = diamonds, aes(x = cut, fill = color)) + geom_bar(colour= "black", size = 0.3 ) +  coord_polar()

ggplot(data = diamonds, aes(x = cut, fill = color)) + geom_bar(colour= "black", position = "dodge" , size = 0.3 ) +  coord_polar()

Sin embargo, tal y como comenta la propia ayuda de la función coord_polar, “polar coordinates has major perceptual problems. (…) Use with EXTREME caution”

Más recursos

Making polar plots with ggplot2

From Parallel Plot to Radar Plot

A radar plot function for visualising Cluster Profiles