Search code examples
rplotggplot2radar-chart

How to plot a Radar chart in ggplot2 or R


I am trying to make a Radar plot as in attached image using and ggplot2 ( or any other package in R).This talk about this but my case is different as i am trying to create a spider plot for response data with certain range. I made a plot using a code as below, but i couldn't figure out howto make this like in the image. Kindly help me with this.

Impcts <- c("system","supply","security","well-being")
present <- c(5,5,3,5)
past <- c(6,6,4,5)
group.names <- c("present", "past")
ddf.pre <- data.frame(matrix(c(rep(group.names[1], 4), Impcts), nrow = 4,      ncol = 2), var.order = seq(1:4), value = present)
ddf.pas <- data.frame(matrix(c(rep(group.names[2], 4), Impcts), nrow = 4, ncol = 2), var.order = seq(1:4), value = past)
 ddf <- rbind(ddf.pre, ddf.pas)
 colnames(ddf) <- c("Group", "Impcts", "var.order", "var.value")
 library(ggplot2)
 ggplot(ddf, aes(y = var.value, x = reorder(Impcts, var.order),
 group =   Group, colour = Group))+
 coord_polar() + 
 geom_path() +
 geom_point()+
 labs(title = "Impacts Analysis").

enter image description here


Solution

  • Here is my attempt.First I drew squares using geom_path(). Then, I drew two polygons on top of the squares using geom_polygon(). Finally I added annotations.

    ### Draw squares
    mydf <- data.frame(id = rep(1:6, each = 5),
                       x = c(0, 6, 0, -6, 0,
                             0, 5, 0, -5, 0,
                             0, 4, 0, -4, 0,
                             0, 3, 0, -3, 0,
                             0, 2, 0, -2, 0,
                             0, 1, 0, -1, 0),
                       y = c(6, 0, -6, 0, 6,
                             5, 0, -5, 0, 5,
                             4, 0, -4, 0, 4,
                             3, 0, -3, 0, 3,
                             2, 0, -2, 0, 2,
                             1, 0, -1, 0, 1))
    
    g <- ggplot(data = mydf, aes(x = x, y = y, group = factor(id)) +
         geom_path()
    
    ### Draw polygons
    mydf2 <- data.frame(id = rep(7:8, each = 5),
                        x = c(0, 6, 0, -5, 0,
                              0, 5, 0, -5, 0),
                        y = c(6, 0, -4, 0, 6,
                              5, 0, -3, 0, 5))
    
    gg <- g +
          geom_polygon(data = mydf2, aes(x = x, y = y, group = factor(id), fill = factor(id))) +
          scale_fill_manual(name = "Time", values = c("darkolivegreen4", "brown4"),
                            labels = c("Past", "Present"))
    
    
    ### Add annotation
    
    mydf3 <- data.frame(x = c(0, 6.5, 0, -6.5),
                        y = c(6.5, 0, -6.5, 0),
                        label = c("system", "supply", "security", "well-being"))
    
    
    ggg <- gg + 
           annotate("text", x = mydf3$x, y = mydf3$y, label = mydf3$label, size = 3)
    
    ggsave(ggg, file = "name.png", width = 10, height = 9)
    

    enter image description here