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