Love Island - exploring double dates

Love Island is back, and with that comes the drama. I will explore some of the connections between the contestants from a very small graph perspective.

Published

June 25, 2026

Love Island is baaaack, We got the drama and everything. One of the aspects of reality dating shows in general is the idea of a love triangle. True love triangles typically don’t happen in these reality dating shows, as they are heavily hetero normative. I’m thus changing the premise of my analysis to be a couple of groups of people who have all been coupled up with each other at some point in the show. Specifically, a set of two women and two men who have all been coupled up with each other at some point in the show. I am calling these “double dates” for lack of a better word. I will explore the number of double dates per season and visualize the connections between contestants in each season.

Code
library(tidyverse)
library(ggraph)
library(tidygraph)
library(igraph)

data <- readr::read_csv("data/data.csv", show_col_types = FALSE)

I have limited myself in this post to only look at the Love Island UK version of the show. I have also limited myself to only looking at past seasons, as there is one ongoing right now. This gives us a total number of seasons of 12 to work with.

Code
chart_graph <- function(data) {
as_tbl_graph(data, directed = FALSE) |>
  ggraph(layout = "fr") +
    geom_edge_link() +
    geom_node_point() +
    geom_node_text(aes(label = name), repel = TRUE) +
    theme_graph() +
    theme(
      plot.background = element_rect(fill = "transparent", color = NA),
      panel.background = element_rect(fill = "transparent", color = NA)
 )
}

I will be treating each contestant as a node in a graph, drawing an edge between them if they have been coupled up at any given time. What makes these types of graphs a little bit atypical is that we have this artificial sparsity. This is due to the fact that we don’t have same-sex coupling happening in the show. Only contestants who have actively been coupled up will be shown in the graph.

You can use the tabset to explore our coupling graph for each season of the show. A couple of interesting observations show up, I’ll list what I see in no particular order of importance.

Code
find_double_dates <- function(data) {
  as_tbl_graph(data, directed = FALSE) |>
  simplify() |>
  simple_cycles(min = 4, max = 4) |>
  pluck("vertices") |>
  map_chr(\(v) paste(names(v), collapse = ", "))
}

I have listed out all of the double dates below for each season.

What is of note is that Conor is part of every one but one of them for season 12.

Code
for (season in sort(unique(data$season))) {
  cat("\n\n## Season", season, "\n\n")
 dates <- find_double_dates(data[data$season == season, ])
  if (length(dates) == 0) {
    cat("_No double dates this season._\n")
 } else {
    cat(paste0("- ", dates, "\n"))
 }
}
  • Lauren, Luis, Zoe, Chris W
  • Lauren, Luis, Danielle, Chris W
  • Luis, Zoe, Chris W, Danielle
  • Olivia, Adam M, Zara, Daniel
  • Kem, Georgia, Sam, Chloë
  • Olivia, Chris, Chloë, Sam
  • Olivia, Marcel, Montana, Sam
  • Montana, Dom, Tyla, Simon

No double dates this season.

No double dates this season.

  • Luke M, Demi, Nas, Jess
  • Chloe, Toby, Abigail, Dale
  • Davide, Ekin-Su, Charlie, Antigoni
  • Luca, Paige, Jacques, Danica
  • Luca, Paige, Jay, Danica
  • Paige, Jacques, Danica, Jay
  • Kai, Olivia, Haris, Anna-May

No double dates this season.

  • Mimii, Ayo, Patsy, Munveer
  • Ciaran, Nicole, Sean, Harriett
  • Sean, Jess, Ronnie, Harriett
  • Cach, Toni, Conor, Emma
  • Toni, Conor, Shakira, Ben
  • Toni, Conor, Yasmin, Ben
  • Toni, Conor, Helena, Ben
  • Harry, Shakira, Conor, Helena
  • Harry, Shakira, Ben, Helena
  • Shakira, Conor, Yasmin, Ben
  • Shakira, Conor, Helena, Ben
  • Yasmin, Conor, Helena, Ben
  • Yasmin, Conor, Helena, Shea
  • Yasmin, Ben, Helena, Shea
  • Conor, Megan, Tommy, Emily
  • Conor, Helena, Blu, Alima

Is this a crazy outlier or a new trend? I guess we will all have to tune in to see for ourselves.

Code
split(data, data$season) |>
  map(find_double_dates) |>
  lengths() |>
  as_tibble() |>
  mutate(season = row_number()) |>
  ggplot2::ggplot(aes(x = season, y = value)) +
  ggplot2::geom_col() +
  ggplot2::scale_x_continuous(breaks = unique(data$season)) +
  ggplot2::labs(
    title = "Number of double dates per season",
    x = "Season",
    y = "Number of double dates"
 ) +
  theme(
      plot.background = element_rect(fill = "transparent", color = NA),
      panel.background = element_rect(fill = "transparent", color = NA)
 )