Click the Original, Code and Reconstruction tabs to read about the issues and how they were fixed.

Deconstruct


Note. Knutson, T. (2014, February 26). The stats that show Luis Suarez is the second-best player on the planet, PLUS Sturridge vs Zlatan!. The Mirror. https://www.mirror.co.uk/sport/football/news/liverpool-stats-luis-suarez-daniel-3184519


Objective and Audience
The objective of this visualistation in 2014 was to persuade and shape the opinion of the reader, that Liverpool striker Luis Suarez was the second-best football player in the world. We know this as it is clearly stated in the title of the news article on The Mirror's website. A secondary objective would have been to generate debate and discussion amongst football supporters, the target audience of the visualistation, to draw more attention and sharing of the news article.

The author attemps to achieve this by using the visuatilon as an explanatory function, in order to shape the opinion of the reader, by using a designer-driven radar chart to display different variables from football data provider Opta to compare Luis Suarez with Lionel Messi and Cristiano Ronaldo (Kirk, 2012). At the time Messi and Ronaldo were 1st and 2nd in the Ballon d'Or awards, recognised as the most prestigious individual award for football players (Relano, 2018).

Deconstruct
The visualisation chosen had the following three main issues:

  • Overall - The use of a radar chart makes it difficult for the audience to see the visualistions objective. The radar chart relies on the audience to visually compare the data of the three players based on the size of the area, which is not the most accurate way of comparing variables (Cleveland and McGill, 1985). It does not appear immediately clear that Luis Suarez is the second-best football player on the planet.

  • Text - The variable labels wrap around the visualisation, meaning the text at the bottom of the chart is upside down and difficult to read. There are also labels for each ring of each variable, with some having zero, one or two decimal places, making the visualisation uneccesarily more complex.

  • Colour - It is unclear why this colour scheme was chosen. It is possible that that the colours are meant to be associated with the player's teams. E.G. Suarez played for Liverpool (main team colour red), Messi played for Barcelona (main colour red and blue stripes) and Ronaldo played for Real Madrid (main colour white, but have gold in their logo). These colour selections are not legible when printed in black and white, are not colour blind friendly (see below) and the overlapping colours makes it unclear which data point belongs to each player.

library(colorblindcheck)
palette_check((c("#E7999B","#809FBB","#FEDA6E","#7C6C88","#8F9873","#DD7A3A","#8B6D63")), plot = TRUE)

##           name n tolerance ncp ndcp  min_dist mean_dist max_dist
## 1       normal 7  16.68292  21   21 16.682922  31.58028 52.34377
## 2 deuteranopia 7  16.68292  21   17  9.141406  25.73335 49.38328
## 3   protanopia 7  16.68292  21   17 10.853718  25.33212 49.25963
## 4   tritanopia 7  16.68292  21   17 10.566745  26.78298 45.08356

Reference

Reconstruct - Code

The following code was used to fix the issues identified in the original.

#Load Libraries
library(dplyr)
library(tidyverse)
library(ggplot2)
library(ggthemes)

#Import Data
opta <- read.csv("opta.csv")
names(opta) <- c("Player","Min","Non-Penalty Goals","Shots",
                 "Shooting%","Passing%","Assists","Key_Passes","Throughballs","Int+Tackles",
                 "Dispossessed","Succesful Dribbles","Goal Conversion%")


#Set Column Names
names(opta) <- c("Player","Min","Non-Penalty_GoalsRAW","ShotsRAW",
                 "Shooting%RAW","Passing%RAW","AssistsRAW","Key_PassesRAW","ThroughballsRAW","Int+TacklesRAW","DispossessedRAW","Succesful_DribblesRAW","Goal_Conversion%RAW")

#CalculateP90 Totals
opta$`Non-Penalty_GoalsP90` <- (opta$`Non-Penalty_GoalsRAW`/opta$Min) * 90
opta$`ShotsP90` <- (opta$`ShotsRAW`/opta$Min) * 90
opta$`AssistsP90` <- (opta$`AssistsRAW`/opta$Min) * 90
opta$`Key PassesP90` <- (opta$`Key_PassesRAW`/opta$Min) * 90
opta$`ThroughballsP90` <- (opta$`ThroughballsRAW`/opta$Min) * 90
opta$`Int+TacklesP90` <- (opta$`Int+TacklesRAW`/opta$Min) * 90
opta$`DispossessedP90` <- (opta$`DispossessedRAW`/opta$Min) * 90
opta$`Succesful DribblesP90` <- (opta$`Succesful_DribblesRAW`/opta$Min) * 90

#Calculate Percentiles 
opta$`Non-Penalty Goals` = rank(opta$`Non-Penalty_GoalsP90`)/nrow(opta)
opta$`Shots` = rank(opta$ShotsP90)/nrow(opta)
opta$`Shooting%` = rank(opta$`Shooting%RAW`)/nrow(opta)
opta$`Passing%` = rank(opta$`Passing%RAW`)/nrow(opta)
opta$Assists = rank(opta$AssistsP90)/nrow(opta)
opta$`Key Passes` = rank(opta$`Key PassesP90`)/nrow(opta)
opta$`Throughballs` = rank(opta$`ThroughballsP90`)/nrow(opta)
opta$`Int+Tackles` = rank(opta$`Int+TacklesP90`)/nrow(opta)
opta$`Dispossessed` = rank(opta$`DispossessedP90`)/nrow(opta)
opta$`Succesful Dribbles` = rank(opta$`Succesful DribblesP90`)/nrow(opta)
opta$`Goal Conversion%` = rank(opta$`Goal_Conversion%RAW`)/nrow(opta)

#Subset P90 Data
p90 <- opta[,c(1,14,15,5,6,16,17,18,19,20,21,13)]
p90 <- p90 %>% gather("Variable","Label",-1)
p90 <- p90 %>% filter(Player == "C. Ronaldo" | Player ==  "L. Messi" | Player == "L. Suarez")

#Subset Percentile Data
rank <- opta[,c(-2:-21)]
rank <- rank %>% gather("Variable","Percentile",-1)
rank <- rank %>% filter(Player == "C. Ronaldo" | Player ==  "L. Messi" | Player == "L. Suarez")

#Set Variable levels
rank$Variable <- factor(rank$Variable,levels = c("Non-Penalty Goals","Shots","Shooting%","Passing%","Assists","Key Passes","Throughballs","Int+Tackles","Dispossessed","Succesful Dribbles","Goal Conversion%"))

# Add P90 label
rank$Label <- p90$Label

#Create visualisation
bar <- ggplot(rank, aes(x = Percentile, y = Variable, fill = Player)) 
viz <- bar + geom_bar(stat = "identity") + 
    facet_grid(Player ~ . ) +
    scale_fill_brewer(palette = "Dark2") +
    labs(title = "Luiz Suarez stats show he is one of the best",
         subtitle = "Suarez's standout season ranks him in the highest percentile of players",
         caption = "Data source: Opta - 2013/14 Top 5 Leagues") +
    theme_fivethirtyeight() +
    theme(panel.grid.major = element_blank()) +
    theme(plot.caption = element_text(hjust=1.3, vjust=-4))+
    theme(strip.text.y = element_text(angle = 360)) +
    theme(axis.text.x = element_text(size=8,angle=45,hjust=0.8)) +
    theme(axis.ticks = element_blank()) +
    theme(axis.text.y = element_blank()) +
    theme(legend.position = "none") +
    scale_y_discrete(limits = unique((rank$Variable))) +
    geom_text(aes(label = paste(round(Percentile,2)*100,"th",sep=""), y = Variable),
              vjust = 1.2, size = 2.5, color = "white") +
    coord_flip()

Data Reference

Opta Provision - 2013/14 Top 5 Leagues. (n.d.) Retrieved from Opta ProVision https://opta.trumedianetworks.com/ (accessed April 14, 2021).

Reconstruction - Output

The following plot fixes the main issues in the original.

viz