library(ggplot2)
library(tibble)

# Create example data: one row of values with sample IDs
df <- tibble(
  Sample.ID = c("a", "b", "c", "d", "e", "f"),
  value = c(1, 2, 3, 4, 5, 6)
)

# Define core samples to be dispersed
core <- c("a", "b", "c")
background <- setdiff(df$Sample.ID, core)

# Compute insertion positions for dispersion
insert_pos <- round(seq(1, length(background) + 1, length.out = length(core) + 1))[-1]

# Insert core elements into the background
combined <- background
offset <- 0
for (i in seq_along(core)) {
  pos <- insert_pos[i] + offset - 1
  combined <- append(combined, core[i], after = pos)
  offset <- offset + 1
}

# Create a new dataframe with dispersed order
df_shuffled <- df[match(combined, df$Sample.ID), ]

# Create a helper function to generate a heatmap
plot_heatmap <- function(data, title) {
  ggplot(data, aes(x = factor(Sample.ID, levels = data$Sample.ID), y = 1, fill = value)) +
    geom_tile(color = "white") +
    geom_text(aes(label = Sample.ID), color = "black") +
    scale_fill_gradient(low = "#E0F3F8", high = "#FC8D59") +
    theme_minimal() +
    labs(title = title, x = "Sample ID", y = "") +
    theme(axis.text.y = element_blank(),
          axis.ticks.y = element_blank(),
          axis.text.x = element_text(angle = 45, hjust = 1))
}

# Plot original order
p1 <- plot_heatmap(df, "Original Order")

# Plot dispersed order
p2 <- plot_heatmap(df_shuffled, "Dispersed Order")

# Display both
library(patchwork)
p1 / p2
## Warning: Use of `data$Sample.ID` is discouraged.
## ℹ Use `Sample.ID` instead.
## Use of `data$Sample.ID` is discouraged.
## ℹ Use `Sample.ID` instead.
## Use of `data$Sample.ID` is discouraged.
## ℹ Use `Sample.ID` instead.
## Use of `data$Sample.ID` is discouraged.
## ℹ Use `Sample.ID` instead.