knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf"))
library(eucs)
library(ggplot2)
library(sp)
library(viridis)

which_match <- function(pattern, string, invert = FALSE) {
  pattern <- as.character(pattern)
  ans <- vapply(pattern, function(pattern) any(grepl(pattern, string)), NA)
  if (invert) ans <- !ans
  names(which(ans))
}

Altitudes of the trait samples that have been collected so far.

with(
  traits_southeast,
  hist(
    altitude_m, breaks = seq(0, 1800, 50), col = "grey", border = NA,
    main = "", xlab = "Altitude (m.a.s.l.)", panel.first = grid(),
    ylab = "Number of samples", las = 1
  )
)
box(bty = "l")

Map of trait sample collections.

ggplot() +
  geom_path(aes(long, lat, group = group), map_southeast) +
  geom_point(
    aes(longitude_gda94, latitude_gda94, col = altitude_m),
    traits_southeast, size = 2, alpha = .1
  ) +
  scale_color_viridis() +
  xlab("Longitude") +
  ylab("Latitude")

List of taxa collected.

(taxa_sampled <- do.call(
  merge,
  c(
    mapply(
      function(x, y) {
        df <- as.data.frame(xtabs(~taxon, x), responseName = y)
        df <- df[order(df[[y]], decreasing = TRUE), ]
      },
      list(
        summarise_traits_by(traits_southeast, tree, taxon),
        traits_southeast
      ),
      c("trees", "samples"),
      SIMPLIFY = FALSE
    ),
    sort = FALSE
  )
))

List of taxa available, but so far not sampled.

(taxa_unsampled <- data.frame(
  taxon = which_match(colnames(wide_southeast[-1:-6]), taxa_sampled$taxon, TRUE)
))

Plot of unsampled taxa.

local({
  par(mfrow = c(6, 6), oma = c(1, 0, 0, 0), mar = c(1, 0, 1, 0))
  for (i in taxa_unsampled$taxon) {
    plot(map_southeast, xlim = c(144, 152), ylim = c(-40, -33))
    points(
      latitude_gda94 ~ longitude_gda94, data = wide_southeast,
      subset = wide_southeast[, i], pch = 19, cex = .5, col = "salmon"
    )
    mtext(gsub("subsp.", "\nsubsp.", i), 1, .25, cex = .6)
  }
})

IycgLS0tCiMnIHRpdGxlOiAiVGFyZ2V0IHRheGEgZm9yIHRoZSBTb3V0aC1lYXN0IEF1c3RyYWxpYSBldWNhbHlwdCB0cmFpdHMgZGF0YXNldCIKIycgYXV0aG9yOiAiV2lsbGlhbSBLLiBNb3JyaXMiCiMnIGRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKIycgb3V0cHV0OgojJyAgIHJtYXJrZG93bjo6aHRtbF9ub3RlYm9vazoKIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQojJyAtLS0KCiMrIHNldHVwLCBtZXNzYWdlPUZBTFNFCmtuaXRyOjpvcHRzX2NodW5rJHNldChjYWNoZSA9IFRSVUUsIGRldiA9IGMoInBuZyIsICJwZGYiKSkKbGlicmFyeShldWNzKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3ApCmxpYnJhcnkodmlyaWRpcykKCndoaWNoX21hdGNoIDwtIGZ1bmN0aW9uKHBhdHRlcm4sIHN0cmluZywgaW52ZXJ0ID0gRkFMU0UpIHsKICBwYXR0ZXJuIDwtIGFzLmNoYXJhY3RlcihwYXR0ZXJuKQogIGFucyA8LSB2YXBwbHkocGF0dGVybiwgZnVuY3Rpb24ocGF0dGVybikgYW55KGdyZXBsKHBhdHRlcm4sIHN0cmluZykpLCBOQSkKICBpZiAoaW52ZXJ0KSBhbnMgPC0gIWFucwogIG5hbWVzKHdoaWNoKGFucykpCn0KCiMnIEFsdGl0dWRlcyBvZiB0aGUgdHJhaXQgc2FtcGxlcyB0aGF0IGhhdmUgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLgojKyB0cmFpdHNhbXBsZWFsdGl0dWRlcwp3aXRoKAogIHRyYWl0c19zb3V0aGVhc3QsCiAgaGlzdCgKICAgIGFsdGl0dWRlX20sIGJyZWFrcyA9IHNlcSgwLCAxODAwLCA1MCksIGNvbCA9ICJncmV5IiwgYm9yZGVyID0gTkEsCiAgICBtYWluID0gIiIsIHhsYWIgPSAiQWx0aXR1ZGUgKG0uYS5zLmwuKSIsIHBhbmVsLmZpcnN0ID0gZ3JpZCgpLAogICAgeWxhYiA9ICJOdW1iZXIgb2Ygc2FtcGxlcyIsIGxhcyA9IDEKICApCikKYm94KGJ0eSA9ICJsIikKCgojJyBNYXAgb2YgdHJhaXQgc2FtcGxlIGNvbGxlY3Rpb25zLgojKyB0cmFpdGNvbGxlY3Rpb25zLCBtZXNzYWdlPUZBTFNFCmdncGxvdCgpICsKICBnZW9tX3BhdGgoYWVzKGxvbmcsIGxhdCwgZ3JvdXAgPSBncm91cCksIG1hcF9zb3V0aGVhc3QpICsKICBnZW9tX3BvaW50KAogICAgYWVzKGxvbmdpdHVkZV9nZGE5NCwgbGF0aXR1ZGVfZ2RhOTQsIGNvbCA9IGFsdGl0dWRlX20pLAogICAgdHJhaXRzX3NvdXRoZWFzdCwgc2l6ZSA9IDIsIGFscGhhID0gLjEKICApICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHhsYWIoIkxvbmdpdHVkZSIpICsKICB5bGFiKCJMYXRpdHVkZSIpCgojJyBMaXN0IG9mIHRheGEgY29sbGVjdGVkLgojKyB0YXhhc2FtcGxlZAoodGF4YV9zYW1wbGVkIDwtIGRvLmNhbGwoCiAgbWVyZ2UsCiAgYygKICAgIG1hcHBseSgKICAgICAgZnVuY3Rpb24oeCwgeSkgewogICAgICAgIGRmIDwtIGFzLmRhdGEuZnJhbWUoeHRhYnMofnRheG9uLCB4KSwgcmVzcG9uc2VOYW1lID0geSkKICAgICAgICBkZiA8LSBkZltvcmRlcihkZltbeV1dLCBkZWNyZWFzaW5nID0gVFJVRSksIF0KICAgICAgfSwKICAgICAgbGlzdCgKICAgICAgICBzdW1tYXJpc2VfdHJhaXRzX2J5KHRyYWl0c19zb3V0aGVhc3QsIHRyZWUsIHRheG9uKSwKICAgICAgICB0cmFpdHNfc291dGhlYXN0CiAgICAgICksCiAgICAgIGMoInRyZWVzIiwgInNhbXBsZXMiKSwKICAgICAgU0lNUExJRlkgPSBGQUxTRQogICAgKSwKICAgIHNvcnQgPSBGQUxTRQogICkKKSkKCiMnIExpc3Qgb2YgdGF4YSBhdmFpbGFibGUsIGJ1dCBzbyBmYXIgbm90IHNhbXBsZWQuCiMrIHRheGFfdW5zYW1wbGVkCih0YXhhX3Vuc2FtcGxlZCA8LSBkYXRhLmZyYW1lKAogIHRheG9uID0gd2hpY2hfbWF0Y2goY29sbmFtZXMod2lkZV9zb3V0aGVhc3RbLTE6LTZdKSwgdGF4YV9zYW1wbGVkJHRheG9uLCBUUlVFKQopKQoKIycgUGxvdCBvZiB1bnNhbXBsZWQgdGF4YS4KIysgcGxvdHVuc2FtcGxlZApsb2NhbCh7CiAgcGFyKG1mcm93ID0gYyg2LCA2KSwgb21hID0gYygxLCAwLCAwLCAwKSwgbWFyID0gYygxLCAwLCAxLCAwKSkKICBmb3IgKGkgaW4gdGF4YV91bnNhbXBsZWQkdGF4b24pIHsKICAgIHBsb3QobWFwX3NvdXRoZWFzdCwgeGxpbSA9IGMoMTQ0LCAxNTIpLCB5bGltID0gYygtNDAsIC0zMykpCiAgICBwb2ludHMoCiAgICAgIGxhdGl0dWRlX2dkYTk0IH4gbG9uZ2l0dWRlX2dkYTk0LCBkYXRhID0gd2lkZV9zb3V0aGVhc3QsCiAgICAgIHN1YnNldCA9IHdpZGVfc291dGhlYXN0WywgaV0sIHBjaCA9IDE5LCBjZXggPSAuNSwgY29sID0gInNhbG1vbiIKICAgICkKICAgIG10ZXh0KGdzdWIoInN1YnNwLiIsICJcbnN1YnNwLiIsIGkpLCAxLCAuMjUsIGNleCA9IC42KQogIH0KfSkKCg==