1context("stat_function") 2 3test_that("uses scale limits, not data limits", { 4 dat <- data_frame(x = c(0.1, 1:100)) 5 dat$y <- dexp(dat$x) 6 7 base <- ggplot(dat, aes(x, y)) + 8 stat_function(fun = dexp) 9 10 full <- base + 11 scale_x_continuous(limits = c(0.1, 100)) + 12 scale_y_continuous() 13 ret <- layer_data(full) 14 15 full_log <- base + 16 scale_x_log10(limits = c(0.1, 100)) + 17 scale_y_continuous() 18 ret_log <- layer_data(full_log) 19 20 expect_equal(ret$y[c(1, 101)], ret_log$y[c(1, 101)]) 21 expect_equal(range(ret$x), c(0.1, 100)) 22 expect_equal(range(ret_log$x), c(-1, 2)) 23 expect_false(any(is.na(ret$y))) 24 expect_false(any(is.na(ret_log$y))) 25}) 26 27test_that("works in plots without any data", { 28 f <- function(x) 2*x 29 30 # default limits, 0 to 1 31 base <- ggplot() + geom_function(fun = f, n = 6) 32 ret <- layer_data(base) 33 expect_identical(ret$x, seq(0, 1, length.out = 6)) 34 expect_identical(ret$y, 2*ret$x) 35 36 # manually set limits with xlim() 37 base <- ggplot() + xlim(0, 2) + geom_function(fun = f, n = 6) 38 ret <- layer_data(base) 39 expect_identical(ret$x, seq(0, 2, length.out = 6)) 40 expect_identical(ret$y, 2*ret$x) 41 42 # manually set limits with xlim argument 43 base <- ggplot() + geom_function(fun = f, n = 6, xlim = c(0, 2)) 44 ret <- layer_data(base) 45 expect_identical(ret$x, seq(0, 2, length.out = 6)) 46 expect_identical(ret$y, 2*ret$x) 47 48 # mapping of color via aes() works 49 base <- ggplot() + 50 geom_function(aes(color = "fun"), fun = f, n = 6) + 51 scale_color_manual(values = c(fun = "#D55E00")) 52 ret <- layer_data(base) 53 expect_identical(ret$x, seq(0, 1, length.out = 6)) 54 expect_identical(ret$y, 2*ret$x) 55 expect_identical(ret$colour, rep("#D55E00", 6)) 56}) 57 58test_that("works with discrete x", { 59 dat <- data_frame(x = c("a", "b")) 60 61 base <- ggplot(dat, aes(x, group = 1)) + 62 stat_function(fun = as.numeric, geom = "point", n = 2) 63 ret <- layer_data(base) 64 65 expect_equal(ret$x, new_mapped_discrete(1:2)) 66 expect_equal(ret$y, 1:2) 67}) 68 69test_that("works with transformed scales", { 70 dat <- data_frame(x = 1:10, y = (1:10)^2) 71 72 # first without explicit mapping of y 73 base <- ggplot(dat, aes(x, group = 1)) + 74 stat_function(fun = ~ .x^2, n = 5) 75 76 ret <- layer_data(base) 77 expect_equal(nrow(ret), 5) 78 expect_equal(ret$x, seq(1, 10, length.out = 5)) 79 expect_equal(ret$y, ret$x^2) 80 81 ret <- layer_data(base + scale_x_log10()) 82 expect_equal(nrow(ret), 5) 83 expect_equal(ret$x, seq(0, 1, length.out = 5)) 84 expect_equal(ret$y, (10^ret$x)^2) 85 86 ret <- layer_data(base + scale_y_log10()) 87 expect_equal(nrow(ret), 5) 88 expect_equal(ret$x, seq(1, 10, length.out = 5)) 89 expect_equal(10^ret$y, ret$x^2) 90 91 ret <- layer_data(base + scale_x_log10() + scale_y_log10()) 92 expect_equal(nrow(ret), 5) 93 expect_equal(ret$x, seq(0, 1, length.out = 5)) 94 expect_equal(10^ret$y, (10^ret$x)^2) 95 96 # now with explicit mapping of y 97 base <- ggplot(dat, aes(x, y)) + geom_point() + 98 stat_function(fun = ~ .x^2, n = 5) 99 100 ret <- layer_data(base, 2) 101 expect_equal(nrow(ret), 5) 102 expect_equal(ret$x, seq(1, 10, length.out = 5)) 103 expect_equal(ret$y, ret$x^2) 104 105 ret <- layer_data(base + scale_x_log10(), 2) 106 expect_equal(nrow(ret), 5) 107 expect_equal(ret$x, seq(0, 1, length.out = 5)) 108 expect_equal(ret$y, (10^ret$x)^2) 109 110 ret <- layer_data(base + scale_y_log10(), 2) 111 expect_equal(nrow(ret), 5) 112 expect_equal(ret$x, seq(1, 10, length.out = 5)) 113 expect_equal(10^ret$y, ret$x^2) 114 115 ret <- layer_data(base + scale_x_log10() + scale_y_log10(), 2) 116 expect_equal(nrow(ret), 5) 117 expect_equal(ret$x, seq(0, 1, length.out = 5)) 118 expect_equal(10^ret$y, (10^ret$x)^2) 119}) 120 121 122test_that("works with formula syntax", { 123 dat <- data_frame(x = 1:10) 124 125 base <- ggplot(dat, aes(x, group = 1)) + 126 stat_function(fun = ~ .x^2, geom = "point", n = 5) + 127 scale_x_continuous(limits = c(0, 10)) 128 ret <- layer_data(base) 129 130 s <- seq(0, 10, length.out = 5) 131 expect_equal(ret$x, s) 132 expect_equal(ret$y, s^2) 133}) 134 135test_that("Warn when drawing multiple copies of the same function", { 136 df <- data_frame(x = 1:3, y = letters[1:3]) 137 p <- ggplot(df, aes(x, color = y)) + stat_function(fun = identity) 138 f <- function() {pdf(NULL); print(p); dev.off()} 139 expect_warning(f(), "Multiple drawing groups") 140}) 141 142test_that("Line style can be changed via provided data", { 143 df <- data_frame(fun = "#D55E00") 144 145 base <- ggplot(df) + 146 geom_function(aes(color = fun), fun = identity, n = 6) + 147 scale_color_identity() 148 ret <- layer_data(base) 149 expect_identical(ret$x, seq(0, 1, length.out = 6)) 150 expect_identical(ret$y, ret$x) 151 expect_identical(ret$colour, rep("#D55E00", 6)) 152 153 base <- ggplot() + 154 geom_function( 155 data = df, aes(color = fun), fun = identity, n = 6 156 ) + 157 scale_color_identity() 158 ret <- layer_data(base) 159 expect_identical(ret$x, seq(0, 1, length.out = 6)) 160 expect_identical(ret$y, ret$x) 161 expect_identical(ret$colour, rep("#D55E00", 6)) 162 163 base <- ggplot() + 164 stat_function( 165 data = df, aes(color = fun), fun = identity, n = 6 166 ) + 167 scale_color_identity() 168 ret <- layer_data(base) 169 expect_identical(ret$x, seq(0, 1, length.out = 6)) 170 expect_identical(ret$y, ret$x) 171 expect_identical(ret$colour, rep("#D55E00", 6)) 172}) 173