tests/testthat/test-hex.R

# Tests for scatterHex
# library(dittoViz); library(testthat); source("tests/testthat/setup.R"); for (i in list.files("R", pattern="^utils", full.names = TRUE)) source(i); source("tests/testthat/test-hex.R")

df$number <- as.numeric(seq_len(nrow(df)))
cont1 <- "bill_length_mm"
cont2 <- "number"
disc <- "species"
disc2 <- "island"

rows.names <- rownames(df)[1:40]
rows.logical <- c(rep(TRUE, 40), rep(FALSE,nrow(df)-40))

test_that("scatterHex can plot density only, and continuous or discrete color.by data", {
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2), "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc), "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2), "ggplot")
})

test_that("scatterHex - bins adjusts number of bins", {
    ### Manual check: Large bins
    expect_s3_class(scatterHex(df, x.by=cont1, y.by=cont2, bins = 5), "ggplot")
})

test_that("scatterHex - color.method options work for discrete data, and defaults to 'max'", {
    ### Manual: Should have continuous color-scale and max.props in its title
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                color.method = "max.prop"),
                    "ggplot")

    ### Manual: Next 2 should be the same plot with discrete color legend and "max" in its title
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                color.method = "max"),
                    "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc),
                    "ggplot")

    expect_error(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                             color.method = "abcde"),
                 "'color.method' not valid", fixed = TRUE)
})

test_that("scatterHex - color.method options work for continuous data, and defaults to 'median'", {
    ### Manual: First should have lower max color than second
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                color.method = "max"),
                    "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                color.method = "sum"),
                    "ggplot")

    ### Manual: Next 2 should be the same plot
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                color.method = "median"),
                    "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2),
                    "ggplot")

    expect_error(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                             color.method = "abcde"),
                 "'color.method' not valid", fixed = TRUE)
})

test_that("scatterHex can be subset to show only certain obs with any rows.use method", {
    expect_s3_class((c1 <- scatterHex(data_frame=df, x.by=cont1, y.by=cont2, data.out = TRUE,
                                       rows.use = rows.names))$plot,
                    "ggplot")
    expect_s3_class((c2 <- scatterHex(data_frame=df, x.by=cont1, y.by=cont2, data.out = TRUE,
                                       rows.use = rows.logical))$plot,
                    "ggplot")
    expect_s3_class((c3 <- scatterHex(data_frame=df, x.by=cont1, y.by=cont2, data.out = TRUE,
                                       rows.use = 1:40))$plot,
                    "ggplot")
    expect_equal(c1$data,c2$data)
    expect_equal(c1$data,c3$data)
    expect_equal(nrow(c3$data), 40)
    # And if we remove an entire grouping...
    expect_s3_class(scatterHex(disc, data_frame=df, x.by=cont1, y.by=cont2,
                                rows.use = df[[disc]]!=0),
                    "ggplot")
})

test_that("scatterHex colors can be adjusted for discrete data", {
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                color.panel = cols), "ggplot")

    ### Manual check: These two should look the same.
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                color.panel = cols[5:1]), "ggplot")
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                color.panel = cols,
                                colors = 5:1), "ggplot")
})

test_that("scatterHex color legend: groupings can be renamed", {
    ### Manual check: color groups should be 1:5 (instead of A:E)
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                rename.color.groups = 1:3), "ggplot")
})

test_that("scatterHex color scales can be adjusted for continuous color data", {

    ### Manual check: Legend range adjusted and black to orange
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                min = -5, max = 150, min.color = "black", max.color = "orange"),
                    "ggplot")

    ### Manual check: Legend has breaks at all 50s in 50 to 300
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                legend.color.breaks = seq(50,300,50)),
                    "ggplot")

    ### Manual check: Plot looks similar to above except from "WOW", 2:5, to "HEY"
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                                legend.color.breaks = seq(50,300,50),
                                legend.color.breaks.labels = c("WOW",2:5,"HEY!")),
                    "ggplot")
})

test_that("scatterHex color scales can be adjusted for density (color)", {

    ### Manual check: Legend range adjusted and black to orange
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2,
                               min.density = -2, max.density = 2, min.color = "black", max.color = "orange"),
                    "ggplot")

    ### Manual check: Legend from 1:3
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2,
                               legend.density.breaks = seq(1:3)),
                    "ggplot")

    ### Manual check: Plot looks similar to above except from "WOW", 2, to "HEY"
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2,
                               legend.density.breaks = seq(1:3),
                               legend.density.breaks.labels = c("WOW",2,"HEY!")),
                    "ggplot")
})

test_that("scatterHex color scales can be adjusted for density (opacity)", {

    ### Manual check: Opacity legend range adjusted -2 to 2 & barely any different
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                               min.density = -2, max.density = 2, min.opacity = 0.5, max.opacity = 0.6),
                    "ggplot")

    ### Manual check: Opacity legend breaks only at 1 and 3
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                               legend.density.breaks = c(1,3)),
                    "ggplot")

    ### Manual check: Opaacity legend from "WOW", 2, to "HEY"
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                               legend.density.breaks = seq(1:3),
                               legend.density.breaks.labels = c("WOW",2,"HEY!")),
                    "ggplot")
})

test_that("scatterHex titles and theme can be adjusted", {

    ### Manual check: All titles should be adjusted.
    expect_s3_class(
        scatterHex(
            cont2, data_frame=df, x.by=cont1, y.by=cont2,
            main = "Gotta catch", sub = "em all",
            xlab = "Pokemon", ylab = "Pokedex #s",
            legend.color.title = "groups",
            legend.density.title = "Encounters"),
        "ggplot")

    ### Manual check: density legend (color)  = Encounters
    expect_s3_class(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2,
            legend.density.title = "Encounters"),
        "ggplot")

    ### Manual check: top and right plot outline removed
    expect_s3_class(scatterHex(cont2, data_frame=df, x.by=cont1, y.by=cont2,
                                theme = theme_classic()),
                    "ggplot")

    ### Manual Check: Legend removed
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2,
                                legend.show = FALSE),
                    "ggplot")
})

test_that("scatterHex can be faceted with split.by (1 or 2 vars)", {

    # MANUAL CHECK: FACETING
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            split.by = disc2),
        "ggplot")

    # MANUAL CHECK: horizontal faceting
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            split.by = disc2,
            split.nrow = 1),
        "ggplot")

    # MANUAL CHECK: vertical faceting
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            split.by = disc2,
            split.ncol = 1),
        "ggplot")

    # MANUAL CHECK: Grid with rows=age, cols=groups
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            split.by = c(disc2,disc)),
        "ggplot")

    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            split.by = c(disc2,disc),
            rows.use = rows.logical),
        "ggplot")
})

test_that("scatterHex allows plotting of multiple vars, via faceting", {
    expect_s3_class(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(cont1, cont2)),
        "ggplot")

    # Works with rows.use
    expect_s3_class(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(cont1, cont2),
            rows.use = rows.logical),
        "ggplot")

    # These should have transposed facet grids
    expect_s3_class(
        print(scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(cont1, cont2),
            split.by = disc2)),
        "ggplot")
    expect_s3_class(
        print(scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(cont1, cont2),
            split.by = disc2, multivar.split.dir = "row")),
        "ggplot")

    expect_error(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(disc, cont1, cont2)),
        "Only numeric", fixed = TRUE)

    expect_warning(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, c(cont1, cont2),
            split.by = c(disc2,disc)),
        "will be ignored", fixed = TRUE)
})

##########
# Added Features
##########

test_that("scatterHex trajectory adding works", {
    expect_s3_class(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, cont2,
            add.trajectory.by.groups = list(
                c("Adelie","Chinstrap","Gentoo")
                ),
            trajectory.group.by = disc),
        "ggplot")

    ### Manual Check: One large arrow.
    expect_s3_class(
        scatterHex(
            data_frame=df, x.by=cont1, y.by=cont2, cont2,
            add.trajectory.by.groups = list(
                c("Adelie","Chinstrap","Gentoo")),
            trajectory.group.by = disc,
            trajectory.arrow.size = 1),
        "ggplot")

    ### Manual Check: Arrows should be detached from points
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            add.trajectory.curves = list(
                data.frame(
                    c(-10,0,-20),
                    c(-20,-10,0)),
                data.frame(
                    c(5:20),
                    c(5:10,9:5,6:10)
                ))),
        "ggplot")
})

test_that("scatterHex adding contours", {
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                do.contour = TRUE),
                    "ggplot")

    ### Manual Check: Contour lines light blue and dashed
    expect_s3_class(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                                do.contour = TRUE,
                                contour.color = "lightblue", contour.linetype = "dashed"),
                    "ggplot")
})

test_that("scatterHex do.label/do.ellipse", {
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            do.label = TRUE),
        "ggplot")
    expect_s3_class(
        scatterHex(
            disc, data_frame=df, x.by=cont1, y.by=cont2,
            do.ellipse = TRUE),
        "ggplot")
})

test_that("scatterHex ignores do.label/do.ellipse for continuous data", {
    expect_message(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                               do.label = TRUE),
                   "do.label was/were ignored for non-discrete data", fixed = TRUE)
    expect_message(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, cont2,
                               do.ellipse = TRUE),
                   "do.ellipse was/were ignored for non-discrete data", fixed = TRUE)

    # No message for discrete data && MANUAAL CHECK: ellipse is drawn
    expect_message(scatterHex(data_frame=df, x.by=cont1, y.by=cont2, disc,
                               do.ellipse = TRUE),
                   NA)
})

# adjustments
test_that("scatterPlot data adjustments applied", {
    expect_s3_class(
        (p <- scatterHex(
            cont1, data_frame = df, x.by=cont1, y.by=cont1, data.out = TRUE,
            x.adj.fxn=function(x) as.vector(scale(x)),
            y.adj.fxn=function(x) {round(as.vector(scale(x)), 0)},
            color.adjustment = "z-score"))$plot, "ggplot")
    expect_equal(
        p$data[[p$cols_used$y.by]],
        round(p$data[[p$cols_used$x.by]],0))
    expect_equal(
        round(mean(p$data[[p$cols_used$x.by]]),0),
        0)
    expect_equal(
        p$data[[p$cols_used$color.by]],
        p$data[[p$cols_used$x.by]])
    expect_s3_class(
        (p <- scatterHex(
            cont1, data_frame = df, x.by=cont1, y.by=cont1, data.out = TRUE,
            y.adjustment= "relative.to.max"))$plot, "ggplot")
    expect_equal(
        max(p$data[[p$cols_used$y.by]]), 1)
})

test_that("scatterPlot added arbitrary horizontal and vertical lines work", {
    expect_s3_class(
        scatterHex(df, "PC1", "PC2", disc,
                    add.yline = c(-1, 1), add.xline = c(2)),
        "ggplot")

    ### Manual Check:
    # Vertical lines dotted and horizontal line red (not black and dashed as above)
    expect_s3_class(
        scatterHex(df, "PC1", "PC2", disc,
                    add.yline = c(-1, 1), add.xline = c(2),
                    yline.color = "red", xline.linetype = "dotted"),
        "ggplot")
})

Try the dittoViz package in your browser

Any scripts or data that you put into this service are public.

dittoViz documentation built on May 29, 2024, 11:15 a.m.