-
Notifications
You must be signed in to change notification settings - Fork 43
WIP: Fix panel.margin with positive values (#180) #286
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ANAMASGARD
wants to merge
15
commits into
master
Choose a base branch
from
fix-panel-margin-positive-values
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 14 commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
dbc1cc5
test: Add failing tests for panel.margin with positive values
ANAMASGARD e122d8d
test: add tests for positive panel.margin values
ANAMASGARD 75b34d0
Added tests for positive panel.margin (fixes #180)
ANAMASGARD 09f0062
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD 7ca1ff3
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD bfe6c8c
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD add8569
test(#180): cover facet_wrap and horizontal facet_grid panel.margin
ANAMASGARD 0891a94
Merge branch 'master' into fix-panel-margin-positive-values
tdhock 2b9d7f2
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD 742928a
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD 7298a72
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD 3d6943f
Merge branch 'master' into fix-panel-margin-positive-values
ANAMASGARD dfc06b8
fix: resolve duplicate Version in DESCRIPTION for CI (PR#286)
ANAMASGARD a83d4e6
docs(NEWS): address tdhock review for panel.margin (PR#286, #180)
ANAMASGARD ac826e8
Removed supported-units paragraph per review
ANAMASGARD File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # Issue #180 / PR #286 — horizontal facet spacing (panel.margin) | ||
| # Run from repo root: source("inst/examples/panel-margin-issue-180.R") | ||
| library(animint2) | ||
|
|
||
| make_plot <- function(n) { | ||
| list( | ||
| plot1 = ggplot(iris, aes(Sepal.Width, Sepal.Length, colour = Species)) + | ||
| geom_point() + | ||
| facet_grid(. ~ Species) + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(n, "lines")) | ||
| ) | ||
| } | ||
|
|
||
| # Screenshot 1: panel.margin = 0 lines (tight columns) | ||
| animint2dir(make_plot(0), "issue180_horizontal_margin0", open.browser = TRUE) | ||
|
|
||
| # Screenshot 2: panel.margin = 2 lines (wider gaps between columns) | ||
| animint2dir(make_plot(2), "issue180_horizontal_margin2", open.browser = TRUE) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
| acontext("panel.margin with positive values - Issue #180") | ||
| test_that("pt.to.lines handles positive lines unit correctly", { | ||
| lines_value <- grid::unit(2, "lines") | ||
| converted <- pt.to.lines(lines_value) | ||
| expect_true(is.numeric(converted)) | ||
| expect_equal(converted, 2) | ||
| expect_gt(converted, 0) | ||
| }) | ||
| test_that("pt.to.lines handles positive cm unit correctly", { | ||
| cm_value <- grid::unit(0.5, "cm") | ||
| converted <- pt.to.lines(cm_value) | ||
| expect_true(is.numeric(converted)) | ||
| expect_gt(converted, 0) | ||
| }) | ||
| test_that("pt.to.lines handles positive pt unit correctly", { | ||
| pt_value <- grid::unit(12, "pt") | ||
| converted <- pt.to.lines(pt_value) | ||
| expect_true(is.numeric(converted)) | ||
| expect_gt(converted, 0) | ||
| expect_false(identical(converted, as.numeric(pt_value))) | ||
| }) | ||
| viz.default <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris)) | ||
| test_that("plot_theme extracts panel.margin correctly for default theme", { | ||
| theme.pars <- plot_theme(viz.default$p1) | ||
| panel_margin <- theme.pars$panel.margin | ||
| expect_false(is.null(panel_margin)) | ||
| expect_true(grid::is.unit(panel_margin)) | ||
| }) | ||
| test_that("positive lines preserved through plot_theme and pt.to.lines", { | ||
| viz <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris) + | ||
| theme(panel.margin = grid::unit(2, "lines"))) | ||
| theme.pars <- plot_theme(viz$p1) | ||
| panel_margin <- theme.pars$panel.margin | ||
| expect_false(is.null(panel_margin)) | ||
| converted <- pt.to.lines(panel_margin) | ||
| expect_true(is.numeric(converted)) | ||
| expect_equal(converted, 2) | ||
| }) | ||
| test_that("positive cm preserved through plot_theme and pt.to.lines", { | ||
| viz <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris) + | ||
| theme(panel.margin = grid::unit(1, "cm"))) | ||
| theme.pars <- plot_theme(viz$p1) | ||
| panel_margin <- theme.pars$panel.margin | ||
| expect_false(is.null(panel_margin)) | ||
| converted <- pt.to.lines(panel_margin) | ||
| expect_true(is.numeric(converted)) | ||
| # pt.to.lines() returns non-pt units as-is (documented limitation): | ||
| # unit(1, "cm") returns numeric 1, not a proper cm-to-lines conversion. | ||
| # The JavaScript renderer uses this value as a line count. | ||
| expect_equal(converted, 1) | ||
| }) | ||
| test_that("zero panel.margin should result in zero spacing", { | ||
| viz <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris) + | ||
| theme(panel.margin = grid::unit(0, "lines"))) | ||
| theme.pars <- plot_theme(viz$p1) | ||
| panel_margin <- theme.pars$panel.margin | ||
| converted <- pt.to.lines(panel_margin) | ||
| expect_equal(converted, 0) | ||
| }) | ||
| test_that("positive panel.margin in lines greater than zero", { | ||
| viz.positive <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris) + | ||
| theme(panel.margin = grid::unit(2, "lines"))) | ||
| viz.zero <- list( | ||
| p1 = ggplot() + | ||
| geom_point(aes(Petal.Length, Sepal.Length, color = Species), data = iris) + | ||
| theme(panel.margin = grid::unit(0, "lines"))) | ||
| theme.positive <- plot_theme(viz.positive$p1) | ||
| theme.zero <- plot_theme(viz.zero$p1) | ||
| converted.positive <- pt.to.lines(theme.positive$panel.margin) | ||
| converted.zero <- pt.to.lines(theme.zero$panel.margin) | ||
| expect_equal(converted.zero, 0) | ||
| expect_gt(converted.positive, converted.zero) | ||
| expect_equal(converted.positive, 2) | ||
| }) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,180 @@ | ||
| acontext("panel.margin positive values - Issue #180 - renderer") | ||
| library(XML) | ||
| panel_x <- function(node_list) { | ||
| attrs <- sapply(node_list, xmlAttrs) | ||
| as.numeric(attrs["x", ]) | ||
| } | ||
| panel_w <- function(node_list) { | ||
| attrs <- sapply(node_list, xmlAttrs) | ||
| as.numeric(attrs["width", ]) | ||
| } | ||
| panel_y <- function(node_list) { | ||
| attrs <- sapply(node_list, xmlAttrs) | ||
| as.numeric(attrs["y", ]) | ||
| } | ||
| panel_h <- function(node_list) { | ||
| attrs <- sapply(node_list, xmlAttrs) | ||
| as.numeric(attrs["height", ]) | ||
| } | ||
| gap_between_panels_y <- function(node_list) { | ||
| y <- sort(panel_y(node_list)) | ||
| h <- panel_h(node_list)[order(panel_y(node_list))] | ||
| y[2] - (y[1] + h[1]) | ||
| } | ||
| gap_between_panels_x <- function(node_list) { | ||
| ord <- order(panel_x(node_list)) | ||
| x <- panel_x(node_list)[ord] | ||
| w <- panel_w(node_list)[ord] | ||
| x[2] - (x[1] + w[1]) | ||
| } | ||
| vertical_gap_between_wrap_rows <- function(node_list) { | ||
| ys <- panel_y(node_list) | ||
| hs <- panel_h(node_list) | ||
| uy <- sort(unique(ys)) | ||
| if (length(uy) < 2) { | ||
| return(NA_real_) | ||
| } | ||
| tol <- 1e-4 | ||
| i1 <- abs(ys - uy[1]) < tol | ||
| bottom1 <- max(ys[i1] + hs[i1]) | ||
| i2 <- abs(ys - uy[2]) < tol | ||
| top2 <- min(ys[i2]) | ||
| top2 - bottom1 | ||
| } | ||
| horizontal_gap_between_wrap_cols <- function(node_list) { | ||
| xs <- panel_x(node_list) | ||
| ws <- panel_w(node_list) | ||
| ux <- sort(unique(xs)) | ||
| if (length(ux) < 2) { | ||
| return(NA_real_) | ||
| } | ||
| tol <- 1e-4 | ||
| i1 <- abs(xs - ux[1]) < tol | ||
| right1 <- max(xs[i1] + ws[i1]) | ||
| i2 <- abs(xs - ux[2]) < tol | ||
| left2 <- min(xs[i2]) | ||
| left2 - right1 | ||
| } | ||
|
|
||
| viz.zero <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(0, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_grid(Species ~ .) | ||
| ) | ||
| viz.positive <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(2, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_grid(Species ~ .) | ||
| ) | ||
| info.zero <- animint2HTML(viz.zero) | ||
| info.positive <- animint2HTML(viz.positive) | ||
| bg.zero <- getNodeSet( | ||
| info.zero$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| bg.positive <- getNodeSet( | ||
| info.positive$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| test_that("three panels rendered with zero panel.margin", { | ||
| expect_equal(length(bg.zero), 3) | ||
| }) | ||
| test_that("three panels rendered with positive panel.margin", { | ||
| expect_equal(length(bg.positive), 3) | ||
| }) | ||
| test_that("panel y-positions are strictly increasing (vertically stacked)", { | ||
| y.vals <- sort(panel_y(bg.positive)) | ||
| expect_true(all(diff(y.vals) > 0)) | ||
| }) | ||
| test_that("positive panel.margin produces larger inter-panel gap than zero margin", { | ||
| gap.zero <- gap_between_panels_y(bg.zero) | ||
| gap.positive <- gap_between_panels_y(bg.positive) | ||
| expect_gt(gap.positive, 0) | ||
| expect_gt(gap.positive, gap.zero) | ||
| }) | ||
|
|
||
| viz.zero.h <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(0, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_grid(. ~ Species) | ||
| ) | ||
| viz.positive.h <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(2, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_grid(. ~ Species) | ||
| ) | ||
| info.zero.h <- animint2HTML(viz.zero.h) | ||
| info.positive.h <- animint2HTML(viz.positive.h) | ||
| bg.zero.h <- getNodeSet( | ||
| info.zero.h$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| bg.positive.h <- getNodeSet( | ||
| info.positive.h$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| test_that("facet_grid columns: three panels with zero panel.margin", { | ||
| expect_equal(length(bg.zero.h), 3) | ||
| }) | ||
| test_that("facet_grid columns: three panels with positive panel.margin", { | ||
| expect_equal(length(bg.positive.h), 3) | ||
| }) | ||
| test_that("facet_grid columns: x-positions strictly increasing", { | ||
| x.vals <- sort(panel_x(bg.positive.h)) | ||
| expect_true(all(diff(x.vals) > 0)) | ||
| }) | ||
| test_that("facet_grid columns: positive margin widens horizontal gap", { | ||
| gap.zero <- gap_between_panels_x(bg.zero.h) | ||
| gap.positive <- gap_between_panels_x(bg.positive.h) | ||
| expect_gt(gap.positive, 0) | ||
| expect_gt(gap.positive, gap.zero) | ||
| }) | ||
|
|
||
| viz.zero.w <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(0, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_wrap(~Species, ncol = 2) | ||
| ) | ||
| viz.positive.w <- list( | ||
| plot1 = ggplot() + | ||
| theme_bw() + | ||
| theme(panel.margin = grid::unit(2, "lines")) + | ||
| geom_point(aes(Sepal.Width, Sepal.Length, colour = Species), data = iris) + | ||
| facet_wrap(~Species, ncol = 2) | ||
| ) | ||
| info.zero.w <- animint2HTML(viz.zero.w) | ||
| info.positive.w <- animint2HTML(viz.positive.w) | ||
| bg.zero.w <- getNodeSet( | ||
| info.zero.w$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| bg.positive.w <- getNodeSet( | ||
| info.positive.w$html, | ||
| '//svg[@id="plot_plot1"]//rect[@class="background_rect"]') | ||
| test_that("facet_wrap: three panels with zero panel.margin", { | ||
| expect_equal(length(bg.zero.w), 3) | ||
| }) | ||
| test_that("facet_wrap: three panels with positive panel.margin", { | ||
| expect_equal(length(bg.positive.w), 3) | ||
| }) | ||
| test_that("facet_wrap: positive margin widens horizontal gap between columns", { | ||
| g0 <- horizontal_gap_between_wrap_cols(bg.zero.w) | ||
| g1 <- horizontal_gap_between_wrap_cols(bg.positive.w) | ||
| expect_false(is.na(g0)) | ||
| expect_false(is.na(g1)) | ||
| expect_gt(g1, 0) | ||
| expect_gt(g1, g0) | ||
| }) | ||
| test_that("facet_wrap: positive margin widens vertical gap between rows", { | ||
| g0 <- vertical_gap_between_wrap_rows(bg.zero.w) | ||
| g1 <- vertical_gap_between_wrap_rows(bg.positive.w) | ||
| expect_false(is.na(g0)) | ||
| expect_false(is.na(g1)) | ||
| expect_gt(g1, 0) | ||
| expect_gt(g1, g0) | ||
| }) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please delete or clarify.
if only lines are supported then we should error for other units?