| Title: | Spatial Visualisation of Admixture on a Projected Map | 
| Version: | 1.2.0 | 
| Description: | Visualise admixture as pie charts on a projected map, admixture as traditional structure barplots or facet barplots, and scatter plots from genotype principal components analysis. A 'shiny' app allows users to create admixture maps interactively. Jenkins TL (2024) <doi:10.1111/1755-0998.13943>. | 
| License: | GPL (≥ 3) | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.3.1 | 
| URL: | https://github.com/Tom-Jenkins/mapmixture | 
| BugReports: | https://github.com/Tom-Jenkins/mapmixture/issues | 
| Imports: | dplyr, ggplot2, ggspatial, grid, purrr, rlang, rnaturalearthdata, sf, stringr, tidyr | 
| Suggests: | bslib, colourpicker, htmltools, shiny, shinyFeedback, shinyjs, shinytest2, shinyWidgets, terra, testthat (≥ 3.2.0), waiter | 
| Config/testthat/edition: | 3 | 
| Depends: | R (≥ 4.2) | 
| NeedsCompilation: | no | 
| Packaged: | 2025-01-23 15:19:39 UTC; tj311 | 
| Author: | Tom Jenkins [aut, cre, cph] | 
| Maintainer: | Tom Jenkins <tom.l.jenkins@outlook.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-01-23 16:00:02 UTC | 
Create Pie Charts
Description
Internal function used to add pie charts to a ggplot object.
Usage
add_pie_charts(
  df,
  admix_columns,
  lat_column,
  lon_column,
  pie_colours,
  border = 0.3,
  border_col = "black",
  opacity = 1,
  pie_size = 1
)
Arguments
| df | data.frame (see examples). | 
| admix_columns | the columns of the data.frame containing admixture data. | 
| lat_column | string or integer representing the latitude column. | 
| lon_column | string or integer representing the longitude column. | 
| pie_colours | vector of colours the same length as the number of clusters. | 
| border | numeric value of zero or greater. | 
| border_col | string denoting colour of pie border. | 
| opacity | numeric value of zero to one. | 
| pie_size | vector of numeric values of zero or greater. Can be a single value or a vector the same length as the number of sites. | 
Value
A list of annotation_custom() objects.
Examples
df <- data.frame(
  site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  lat = c(51.51, 48.85, 52.52, 41.90, 40.42),
  lon = c(-0.12, 2.35, 13.40, 12.49, -3.70),
  Cluster1 = c(0.95, 0.5, 0.1, 0, 0),
  Cluster2 = c(0.05, 0.45, 0.45, 0.01, 0.75),
  Cluster3 = c(0, 0.05, 0.45, 0.99, 0.25)
)
df <- data.frame(
  site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  lat = c(6712008, 6249448, 6894700, 5146012, 4927165),
  lon = c(-13358.34, 261600.80, 1491681.18, 1390380.44, -411882.12),
  Cluster1 = c(0.95, 0.5, 0.1, 0, 0),
  Cluster2 = c(0.05, 0.45, 0.45, 0.01, 0.75),
  Cluster3 = c(0, 0.05, 0.45, 0.99, 0.25)
)
add_pie_charts(df,
  admix_columns = 4:ncol(df),
  lat_column = "lat",
  lon_column = "lon",
  pie_colours = c("blue","purple","green"),
  border = 0.3,
  opacity = 1,
  pie_size = 1
)
Build Pie Chart
Description
Internal function used to build a pie chart using ggplot
Usage
build_pie_chart(
  df,
  location,
  cols = NULL,
  border = 0.3,
  opacity = 1,
  border_col = "black"
)
Arguments
| df | data.frame (see examples). | 
| location | string containing the site to subset. | 
| cols | vector of colours the same length as the number of clusters. | 
| border | numeric value of zero or greater. | 
| opacity | numeric value of zero to one. | 
| border_col | string denoting colour of pie border. | 
Value
A ggplot object.
Examples
df <- data.frame(
  site = c("London","London","London","Paris","Paris","Paris",
           "Berlin","Berlin","Berlin","Rome","Rome","Rome",
           "Madrid","Madrid","Madrid"),
  cluster = c("Cluster1","Cluster2","Cluster3","Cluster1","Cluster2","Cluster3",
              "Cluster1","Cluster2","Cluster3","Cluster1","Cluster2","Cluster3",
              "Cluster1","Cluster2","Cluster3"),
  value = c(0.95, 0.05, 0, 0.50, 0.45, 0.05, 0.10, 0.45, 0.45, 0,
            0.01, 0.99, 0, 0.75, 0.25)
)
build_pie_chart(df, location = "London")
Calculate Default Bounding Box
Description
Internal function to calculate a default bounding box for a set of longitude and latitude coordinates.
Usage
calc_default_bbox(data, expand = NULL)
Arguments
| data | data.frame or tibble containing three columns. 1st column is a character vector of site names. 2nd column is a numeric vector of latitude values. 3rd column is a numeric vector of longitude values. | 
| expand | numeric value indicating how much % to increase the coordinates limits. | 
Value
A bbox object.
Examples
coords <- data.frame(
  site = c("Site1","Site2","Site3"),
  lat = c(40.0, 50.5, 60.5),
  lon = c(-1.0, 5.0, 10.5)
)
calc_default_bbox(coords, expand = NULL)
calc_default_bbox(coords, expand = 0.10)
Launch Shiny App
Description
Wrapper function used to start mapmixture interactive app.
App tested with the following package versions:
shiny v1.8.0, shinyFeedback v0.4.0, shinyjs v2.1.0, shinyWidgets 0.8.4, bslib 0.7.0, colourpicker 1.3.0, htmltools v0.5.8.1, waiter 0.2.5.
Usage
launch_mapmixture(...)
Arguments
| ... | additional arguments passed to  | 
Value
No return value.
Examples
if (interactive()){
  launch_mapmixture(launch.browser = TRUE)
}
Plot Pie Charts on Map
Description
Plot admixture proportions as pie charts on a projected map. In data sets where there are multiple individuals per site, the function will calculate the mean average admixture proportion for each site.
Usage
mapmixture(
  admixture_df,
  coords_df,
  cluster_cols = NULL,
  cluster_names = NULL,
  boundary = NULL,
  crs = 4326,
  basemap = NULL,
  pie_size = 1,
  pie_border = 0.2,
  pie_border_col = "black",
  pie_opacity = 1,
  land_colour = "#d9d9d9",
  sea_colour = "#deebf7",
  expand = FALSE,
  arrow = TRUE,
  arrow_size = 1,
  arrow_position = "tl",
  scalebar = TRUE,
  scalebar_size = 1,
  scalebar_position = "tl",
  plot_title = "",
  plot_title_size = 12,
  axis_title_size = 10,
  axis_text_size = 8,
  basemap_border = TRUE,
  basemap_border_col = "black",
  basemap_border_lwd = 0.1
)
Arguments
| admixture_df | data.frame or tibble containing admixture data (see examples). | 
| coords_df | data.frame or tibble containing coordinates data (see examples). | 
| cluster_cols | character vector of colours the same length as the number of clusters.
If  | 
| cluster_names | character vector of names the same length as the number of clusters.
If  | 
| boundary | named numeric vector defining the map bounding. e.g.  | 
| crs | coordinate reference system. Default is the WGS 84 - World Geodetic System 1984 (EPSG: | 
| basemap | SpatRaster or sf object to use as the basemap. A SpatRaster object can be created from a file
using the  | 
| pie_size | vector of numeric values of zero or greater. Can be a single value or a vector the same length as the number of sites. | 
| pie_border | numeric value of zero or greater. | 
| pie_border_col | string denoting colour of pie border. | 
| pie_opacity | numeric value of zero to one. | 
| land_colour | string defining the colour of land. | 
| sea_colour | string defining the colour of sea. | 
| expand | expand axes ( | 
| arrow | show arrow ( | 
| arrow_size | numeric value of zero or greater. | 
| arrow_position | string defining the position of the arrow ( | 
| scalebar | show scalebar ( | 
| scalebar_size | numeric value of zero or greater. | 
| scalebar_position | string defining the position of the scalebar ( | 
| plot_title | string defining the main title of the plot. | 
| plot_title_size | numeric value of zero or greater. | 
| axis_title_size | numeric value of zero or greater. | 
| axis_text_size | numeric value of zero or greater. | 
| basemap_border | boolean denoting whether to show basemap polygon borders. | 
| basemap_border_col | string defining colour of basemap polygon borders. | 
| basemap_border_lwd | numeric value defining linewidth of basemap polygon borders. | 
Value
A ggplot object.
Examples
# Admixture Format 1
file <- system.file("extdata", "admixture1.csv", package = "mapmixture")
admixture1 <- read.csv(file)
# Admixture Format 2
file <- system.file("extdata", "admixture2.csv", package = "mapmixture")
admixture2 <- read.csv(file)
# Admixture Format 3
file <- system.file("extdata", "admixture3.csv", package = "mapmixture")
admixture3 <- read.csv(file)
# Coordinates Format
file <- system.file("extdata", "coordinates.csv", package = "mapmixture")
coordinates <- read.csv(file)
# Plot using default parameters
mapmixture(admixture1, coordinates)
# Plot using the ETRS89-extended / LAEA Europe coordinate reference system
mapmixture(admixture1, coordinates, crs = 3035)
# Plot using custom parameters
mapmixture(
  admixture_df = admixture1,
  coords_df = coordinates,
  cluster_cols = c("#f1a340","#998ec3"),
  cluster_names = c("Group 1","Group 2"),
  crs = "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +units=m",
  boundary = c(xmin=-15, xmax=16, ymin=40, ymax=62),
  pie_size = 1.5,
  pie_border = 0.2,
  pie_opacity = 1,
  land_colour = "#d9d9d9",
  sea_colour = "#deebf7",
  expand = FALSE,
  arrow = TRUE,
  arrow_size = 1,
  arrow_position = "tl",
  scalebar = TRUE,
  scalebar_size = 1,
  scalebar_position = "tl",
  plot_title = "Mapmixture Figure",
  plot_title_size = 15,
  axis_title_size = 12,
  axis_text_size = 10
)
Merge coordinates and admixture data
Description
Internal function used to join coordinates and admixture pie data.
Usage
merge_coords_data(coord_df, admix_df)
Arguments
| coord_df | a data.frame of site names and coordinates. | 
| admix_df | a data.frame of site names and admixture data. | 
Value
data.frame
Examples
# Admixture Format 1
df_admix <- data.frame(
  Site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  Cluster1 = c(0.95, 0.5, 0.1, 0, 0),
  Cluster2 = c(0.05, 0.45, 0.45, 0.01, 0.75),
  Cluster3 = c(0, 0.05, 0.45, 0.99, 0.25)
)
# Coordinates Format
df_coords <- data.frame(
  Site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  Lat = c(51.51, 48.85, 52.52, 41.90, 40.42),
  Lon = c(-0.12, 2.35, 13.40, 12.49, -3.70)
)
merge_coords_data(df_coords, df_admix)
Read Input Data
Description
Internal function used to read in data from admixture or coordinates input file.
Usage
read_input_data(file)
Arguments
| file | path to input file. | 
Value
A data.frame object.
Examples
file_path <- system.file("extdata", "admixture1.csv", package = "mapmixture")
read_input_data(file_path)
PCA or DAPC Scatter Plot
Description
Plot a scatter plot of PCA or DAPC results.
Usage
scatter_plot(
  dataframe,
  group_ids,
  other_group = NULL,
  type = "points",
  ...,
  labels = NULL,
  axes = c(1, 2),
  colours = NULL,
  centroids = TRUE,
  segments = TRUE,
  point_size = 3,
  point_type = 21,
  centroid_size = 3,
  hvline_type = "dotted",
  hvline_size = 0.5,
  hvline_colour = "black",
  xlab = "Axis",
  ylab = "Axis",
  percent = NULL,
  plot_title = ""
)
Arguments
| dataframe | data.frame or tibble containing results from a PCA or DAPC (see examples). | 
| group_ids | character vector of IDs representing the group each row belongs to. This is used to colour the scatter plot and (optionally) add centroids and segments. E.g. a vector of site names, a vector of biological categories such as male or female, etc. | 
| other_group | secondary character vector of IDs defining how to colour the scatter plot.
E.g. a vector of country names (see examples).
If  | 
| type | string defining whether to show points ( | 
| ... | additional arguments passed to  | 
| labels | character vector of IDs defining labels when  | 
| axes | integer vector of length two defining which axes to plot. | 
| colours | character vector of colours the same length as the number of groups defined in group_ids or other_group. | 
| centroids | add centroids to plot ( | 
| segments | add segments to plot ( | 
| point_size | numeric value for point size. | 
| point_type | numeric value for point type (shape). | 
| centroid_size | numeric value for centroid label size. | 
| hvline_type | integer or string defining linetype ( | 
| hvline_size | integer defining linewidth. | 
| hvline_colour | string defining line colour. | 
| xlab | string defining x axis label. | 
| ylab | string defining y axis label. | 
| percent | numeric vector the same length as  | 
| plot_title | string defining the main title of the plot. | 
Value
A ggplot object.
Examples
# Results from a Principal Components Analysis
file <- system.file("extdata", "pca_results.csv", package = "mapmixture")
pca_results <- read.csv(file)
# Define parameters
ind_names <- row.names(pca_results)
site_names <- rep(c("Pop1", "Pop2", "Pop3", "Pop4", "Pop5", "Pop6"), each = 100)
region_names <- rep(c("Region1", "Region2"), each = 300)
percent <- c(5.6, 4.5, 3.2, 2.0, 0.52)
# Scatter plot
scatter_plot(pca_results, site_names)
# Scatter plot with axes 1 and 3 and percent on axis labels
scatter_plot(pca_results, site_names, axes = c(1,3), percent = percent)
# Scatter plot with no centroids and segments
scatter_plot(pca_results, site_names, axes = c(1,2), percent = percent,
             centroids = FALSE, segments = FALSE)
# Scatter plot with custom colours and coloured by other_group
scatter_plot(pca_results, site_names, other_group = region_names,
             percent = percent, colours = c("#f1a340","#998ec3"))
# Scatter plot with individual labels
scatter_plot(pca_results, site_names, type = "labels",
             labels = rownames(pca_results))
# Scatter plot with individual text
scatter_plot(pca_results, site_names, type = "text",
             labels = rownames(pca_results))
Standardise Input Data
Description
Internal function used to standardise the output from mapmixture::read_input_data().
Usage
standardise_data(df, type = "admixture")
Arguments
| df | a data.frame. | 
| type | type of file to process ( | 
Value
A data.frame object.
Examples
# Standardise admixture data
df_admix <- data.frame(
  Site = c("London", "London", "Paris", "Paris", "Berlin", "Berlin",
   "Rome", "Rome", "Madrid", "Madrid"),
  Ind = c("London1", "London2", "Paris1", "Paris2", "Berlin1", "Berlin2",
   "Rome1", "Rome2", "Madrid1", "Madrid2"),
  Cluster1 = c(1.0, 0.9, 0.5, 0.5, 0.1, 0.1, 0, 0, 0, 0),
  Cluster2 = c(0, 0.10, 0.50, 0.40, 0.50, 0.40, 0.01, 0.01, 0.70, 0.80),
  Cluster3 = c(0, 0, 0, 0.10, 0.40, 0.50, 0.99, 0.99, 0.30, 0.20)
)
standardise_data(df_admix, type = "admixture")
# Standardise coordinates data
df_coords <- data.frame(
  Site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  Lat = c(51.51, 48.85, 52.52, 41.90, 40.42),
  Lon = c(-0.12, 2.35, 13.40, 12.49, -3.70)
)
standardise_data(df_coords, type = "coordinates")
STRUCTURE Barplot
Description
Plot a traditional STRUCTURE barplot or a facet barplot from individual admixture proportions.
Usage
structure_plot(
  admixture_df,
  type = "structure",
  cluster_cols = NULL,
  cluster_names = NULL,
  legend = "none",
  labels = "site",
  flip_axis = FALSE,
  ylabel = "Proportion",
  site_dividers = TRUE,
  divider_width = 1,
  divider_col = "white",
  divider_type = "dashed",
  site_order = NULL,
  display_site_labels = TRUE,
  site_labels_size = 2,
  site_labels_x = 0,
  site_labels_y = -0.025,
  site_labels_angle = 0,
  site_ticks = TRUE,
  site_ticks_size = -0.01,
  facet_col = NULL,
  facet_row = NULL
)
Arguments
| admixture_df | data.frame or tibble containing admixture data (see examples). | 
| type | show a traditional STRUCTURE barplot ("structure") or a facet barplot ("facet"). | 
| cluster_cols | character vector of colours the same length as the number of clusters.
If  | 
| cluster_names | character vector of names the same length as the number of clusters.
If  | 
| legend | add legend at position ( | 
| labels | show labels at the site level or the individual level ("site" or "individual"). | 
| flip_axis | flip the axes so that the plot is vertical (TRUE or FALSE). Default is FALSE (horizontal barplot). | 
| ylabel | string for y label. | 
| site_dividers | add dotted lines that divide sites (TRUE or FALSE). | 
| divider_width | width of site divider lines. | 
| divider_col | colour of site divider lines. | 
| divider_type | linetype of site divider line. | 
| site_order | character vector of site labels used to customise the order of sites.
If  | 
| display_site_labels | display site labels (TRUE or FALSE). | 
| site_labels_size | numeric value for site label size. | 
| site_labels_x | numeric value for site label horizontal position. | 
| site_labels_y | numeric value for site label vertical position. | 
| site_labels_angle | numeric value for rotating angle of site label. | 
| site_ticks | show ticks when labels = "site". | 
| site_ticks_size | numeric value for site tick size. | 
| facet_col | number of columns to display for facet barplot. | 
| facet_row | number of rows to display for facet barplot. | 
Value
A ggplot object.
Examples
# Admixture Format 1
file <- system.file("extdata", "admixture1.csv", package = "mapmixture")
admixture1 <- read.csv(file)
structure_plot(admixture1, type = "structure")
structure_plot(admixture1, type = "facet", facet_col = 5)
Transform Admixture Data
Description
Internal function used to transform admixture data into the correct format for plotting.
Usage
transform_admix_data(data)
Arguments
| data | data.frame or tibble. | 
Value
A data.frame or tibble.
Examples
# Admixture Format 1
df_admix <- data.frame(
  Site = c("London", "London", "Paris", "Paris", "Berlin", "Berlin",
   "Rome", "Rome", "Madrid", "Madrid"),
  Ind = c("London1", "London2", "Paris1", "Paris2", "Berlin1", "Berlin2",
   "Rome1", "Rome2", "Madrid1", "Madrid2"),
  Cluster1 = c(1.0, 0.9, 0.5, 0.5, 0.1, 0.1, 0, 0, 0, 0),
  Cluster2 = c(0, 0.10, 0.50, 0.40, 0.50, 0.40, 0.01, 0.01, 0.70, 0.80),
  Cluster3 = c(0, 0, 0, 0.10, 0.40, 0.50, 0.99, 0.99, 0.30, 0.20)
)
transform_admix_data(df_admix)
Transform Bounding Box Coordinates
Description
Internal function used to transform latitude and longitude coordinates to a target coordinate reference system.
Usage
transform_bbox(bbox, CRS)
Arguments
| bbox | named numeric vector of length four, with  | 
| CRS | numeric value representing an ESPG. | 
Value
A named numeric vector.
Examples
bbox <- c(xmin = -3.70, xmax = 13.40, ymin = 40.42, ymax = 52.52)
transform_bbox(bbox, 3035)
Transform Coordinates in Data Frame
Description
Internal function used to transform latitude and longitude coordinates in admixture data.frame.
Usage
transform_df_coords(df, crs)
Arguments
| df | a data.frame containing site names, lat and lon coordinates and admixture data. | 
| crs | a coordinate reference system. | 
Value
a data.frame with coordinates transformed.
Examples
df <- data.frame(
  site = c("London", "Paris", "Berlin", "Rome", "Madrid"),
  lat = c(51.51, 48.85, 52.52, 41.90, 40.42),
  lon = c(-0.12, 2.35, 13.40, 12.49, -3.70),
  Cluster1 = c(0.95, 0.5, 0.1, 0, 0),
  Cluster2 = c(0.05, 0.45, 0.45, 0.01, 0.75),
  Cluster3 = c(0, 0.05, 0.45, 0.99, 0.25)
)
transform_df_coords(df, crs = 3857)