acontext('facet_grid(space="free")')
no.panels <- ggplot(mtcars, aes(mpg, wt)) +
geom_point(colour='grey50', size = 4) +
geom_point(aes(colour = cyl))
viz <- animint(
freeBoth = no.panels +
ggtitle("space=free, scales=free")+
facet_grid(.~am, space = "free", scales = "free", labeller=label_both),
freeScale = no.panels +
ggtitle("space=fixed, scales=free")+
facet_grid(.~am, scales="free", labeller=label_both),
fixed = no.panels +
ggtitle("space=fixed, scales=fixed")+
facet_grid(.~am, labeller=label_both))
info <- animint2HTML(viz)
## For some reason the "space between panels" tests only work on
## travis/wercker if the rect class is "background_rect". Not
## "border_rect"! Even though they both should appear, only
## background_rect appears on travis/wercker... is this because we
## don't wait long enough before calling getHTML()?
panel.rect.xpath.tmp <- '//svg[@id="plot_%s"]//rect[@class="background_rect"]'
test_that("some horizontal space between panels", {
for(plot.name in names(viz)){
xpath <- sprintf(panel.rect.xpath.tmp, plot.name)
rect.list <- getNodeSet(info$html, xpath)
expect_equal(length(rect.list), 2)
first <- xmlAttrs(rect.list[[1]])
first.left <- as.numeric(first[["x"]])
first.right <- first.left+as.numeric(first[["width"]])
second <- xmlAttrs(rect.list[[2]])
second.left <- as.numeric(second[["x"]])
second.right <- second.left+as.numeric(second[["width"]])
expect_lt(first.right, second.left)
## Also make sure the xtitle is placed in the middle of the
## plotting region.
xpath <- sprintf('//svg[@id="plot_%s"]//text[@class="xtitle"]', plot.name)
text.list <- getNodeSet(info$html, xpath)
expect_equal(length(text.list), 1)
transform.str <- xmlAttrs(text.list[[1]])[["transform"]]
transform.mat <- str_match_perl(transform.str, translatePattern)
xtitle.x.computed <- as.numeric(transform.mat[, "x"])
xtitle.x.expected <- (first.left + second.right)/2
expect_equal(xtitle.x.computed, xtitle.x.expected)
}
})
test_that("each plot has two x axes and 1 y axis", {
for(plot.name in names(viz)){
svg.xpath <- sprintf("//svg[@id='plot_%s']", plot.name)
x.xpath <- paste0(svg.xpath, "//g[contains(@class, 'xaxis')]")
x.axes <- getNodeSet(info$html, x.xpath)
y.xpath <- paste0(svg.xpath, "//g[contains(@class, 'yaxis')]")
y.axes <- getNodeSet(info$html, y.xpath)
expect_equal(length(y.axes), 1)
}
})
test_that("top strips present in each plot", {
for(plot.name in names(viz)){
xpath <- sprintf(
"//svg[@id='plot_%s']//g[@class='topStrip']//text", plot.name)
strip.text <- getNodeSet(info$html, xpath)
expect_equal(length(strip.text), 2)
text.values <- sapply(strip.text, xmlValue)
expect_identical(text.values, c("am: 0", "am: 1"))
}
})
test_that("pixels between 15 and 20 is constant or variable", {
## scale="fixed" means the distance between ticks 15 and 20 should
## be the same across the 2 panels.
x.axes <- getNodeSet(
info$html, "//svg[@id='plot_fixed']//g[contains(@class, 'xaxis')]")
expect_equal(length(x.axes), 2)
xdiff <- lapply(x.axes, getTickDiff)
expect_true(both.equal(xdiff))
## scale="free" means the distance between ticks 15 and 20 should
## be different across the 2 panels.
x.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeScale']//g[contains(@class, 'xaxis')]")
expect_equal(length(x.axes), 2)
xdiff <- lapply(x.axes, getTickDiff)
expect_true(!both.equal(xdiff))
## scale="free" and space="free" means the distance between ticks 15
## and 20 should be the same across the 2 panels.
x.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeBoth']//g[contains(@class, 'xaxis')]")
expect_equal(length(x.axes), 2)
xdiff <- lapply(x.axes, getTickDiff)
expect_true(both.equal(xdiff))
})
test_that("width_proportion is constant or variable", {
expect_true(both.equal(info$plots$fixed$layout$width_proportion))
expect_true(both.equal(info$plots$freeScale$layout$width_proportion))
expect_true(!both.equal(info$plots$freeBoth$layout$width_proportion))
})
viz <- animint(
freeBothFlip = ggplot(mtcars, aes(wt, mpg)) +
ggtitle("space=free, scales=free") +
scale_x_continuous(breaks=seq(1, 9)) +
geom_point(colour='grey50', size = 4) +
geom_point(aes(colour = cyl)) +
facet_grid(am ~ vs, space = "free", scales = "free", labeller=label_both))
info <- animint2HTML(viz)
test_that("same spacing for vertical and horizontal ticks", {
## scale="free" and space="free" means the distance between ticks
## should be the same across the horizontal and vertical panels.
x.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeBothFlip']//g[contains(@class, 'xaxis')]")
expect_equal(length(x.axes), 2)
xdiff <- lapply(x.axes, getTickDiff, axis="x")
expect_true(both.equal(xdiff))
y.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeBothFlip']//g[contains(@class, 'yaxis')]")
expect_equal(length(y.axes), 2)
ydiff <- lapply(y.axes, getTickDiff, axis="y")
expect_true(both.equal(ydiff))
})
no.panels <- ggplot(mtcars, aes(wt, mpg)) +
geom_point(colour='grey50', size = 4) +
geom_point(aes(colour = cyl))
viz <-
list(freeBoth = no.panels +
facet_grid(am ~ ., space = "free", scales = "free",
labeller=label_both),
freeScale = no.panels +
facet_grid(am ~ ., scales="free", labeller=label_both),
fixed = no.panels +
facet_grid(am ~ ., labeller=label_both))
info <- animint2HTML(viz)
test_that("some vertical space between panels", {
for(plot.name in names(viz)){
xpath <- sprintf(panel.rect.xpath.tmp, plot.name)
rect.list <- getNodeSet(info$html, xpath)
expect_equal(length(rect.list), 2)
first <- xmlAttrs(rect.list[[1]])
first.top <- as.numeric(first[["y"]])
first.bottom <- first.top+as.numeric(first[["height"]])
second <- xmlAttrs(rect.list[[2]])
second.top <- as.numeric(second[["y"]])
second.bottom <- second.top+as.numeric(second[["height"]])
expect_lt(first.bottom, second.top)
## Also check that ytitle is placed in the middle of the plotting
## region.
xpath <- sprintf('//svg[@id="plot_%s"]//text[@class="ytitle"]', plot.name)
text.list <- getNodeSet(info$html, xpath)
expect_equal(length(text.list), 1)
transform.str <- xmlAttrs(text.list[[1]])[["transform"]]
transform.mat <- str_match_perl(transform.str, translatePattern)
ytitle.y.computed <- as.numeric(transform.mat[, "y"])
ytitle.y.expected <- (first.top + second.bottom)/2
expect_equal(ytitle.y.computed, ytitle.y.expected)
}
})
test_that("right strips present in each plot", {
for(plot.name in names(viz)){
xpath <- sprintf(
"//svg[@id='plot_%s']//g[@class='rightStrip']//text", plot.name)
strip.text <- getNodeSet(info$html, xpath)
expect_equal(length(strip.text), 2)
text.values <- sapply(strip.text, xmlValue)
expect_identical(text.values, c("am: 0", "am: 1"))
}
})
test_that("y pixels between 15 and 20 is constant or variable", {
## scale="fixed" means the distance between ticks 15 and 20 should
## be the same across the 2 panels.
y.axes <- getNodeSet(
info$html, "//svg[@id='plot_fixed']//g[contains(@class, 'yaxis')]")
expect_equal(length(y.axes), 2)
ydiff <- lapply(y.axes, getTickDiff, axis="y")
expect_true(both.equal(ydiff))
## scale="free" means the distance between ticks 15 and 20 should
## be different across the 2 panels.
y.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeScale']//g[contains(@class, 'yaxis')]")
expect_equal(length(y.axes), 2)
ydiff <- lapply(y.axes, getTickDiff, axis="y")
expect_true(!both.equal(ydiff))
## scale="free" and space="free" means the distance between ticks 15
## and 20 should be the same across the 2 panels.
y.axes <- getNodeSet(
info$html, "//svg[@id='plot_freeBoth']//g[contains(@class, 'yaxis')]")
expect_equal(length(y.axes), 2)
ydiff <- lapply(y.axes, getTickDiff, axis="y")
expect_true(both.equal(ydiff))
})
test_that("height_proportion is constant or variable", {
expect_true(both.equal(info$plots$fixed$layout$height_proportion))
expect_true(both.equal(info$plots$freeScale$layout$height_proportion))
expect_true(!both.equal(info$plots$freeBoth$layout$height_proportion))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.