Skip to content

Commit

Permalink
Bug fix. Account for multi_line=FALSE when facet rows/cols are missing.
Browse files Browse the repository at this point in the history
  • Loading branch information
trekonom committed Aug 5, 2024
1 parent 3cf17c0 commit 9352fd4
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 21 deletions.
54 changes: 33 additions & 21 deletions R/ggplotly.R
Original file line number Diff line number Diff line change
Expand Up @@ -917,11 +917,15 @@ gg2list <- function(p, width = NULL, height = NULL,
# facet strips -> plotly annotations
if (has_facet(plot)) {
col_vars <- ifelse(inherits(plot$facet, "FacetWrap"), "facets", "cols")
col_txt <- paste(
plot$facet$params$labeller(
lay[names(plot$facet$params[[col_vars]])]
), collapse = br()
)
col_txt <- if (!length(names(plot$facet$params[[col_vars]])) == 0) {
paste(
plot$facet$params$labeller(
lay[names(plot$facet$params[[col_vars]])]
), collapse = br()
)
} else {
""
}
if (is_blank(theme[["strip.text.x"]])) col_txt <- ""
if (inherits(plot$facet, "FacetGrid") && lay$ROW != 1) col_txt <- ""
if (robust_nchar(col_txt) > 0) {
Expand All @@ -934,22 +938,30 @@ gg2list <- function(p, width = NULL, height = NULL,
strip <- make_strip_rect(xdom, ydom, theme, "top")
gglayout$shapes <- c(gglayout$shapes, strip)
}
row_txt <- paste(
plot$facet$params$labeller(
lay[names(plot$facet$params$rows)]
), collapse = br()
)
if (is_blank(theme[["strip.text.y"]])) row_txt <- ""
if (inherits(plot$facet, "FacetGrid") && lay$COL != nCols) row_txt <- ""
if (robust_nchar(row_txt) > 0) {
row_lab <- make_label(
row_txt, x = max(xdom), y = mean(ydom),
el = theme[["strip.text.y"]] %||% theme[["strip.text"]],
xanchor = "left", yanchor = "middle"
)
gglayout$annotations <- c(gglayout$annotations, row_lab)
strip <- make_strip_rect(xdom, ydom, theme, "right")
gglayout$shapes <- c(gglayout$shapes, strip)
# Only FacetGrid has no cols
if (inherits(plot$facet, "FacetGrid")) {
row_txt <- if (!length(names(plot$facet$params$rows)) == 0) {
paste(
plot$facet$params$labeller(
lay[names(plot$facet$params$rows)]
),
collapse = br()
)
} else {
""
}
if (is_blank(theme[["strip.text.y"]])) row_txt <- ""
if (lay$COL != nCols) row_txt <- ""
if (robust_nchar(row_txt) > 0) {
row_lab <- make_label(
row_txt, x = max(xdom), y = mean(ydom),
el = theme[["strip.text.y"]] %||% theme[["strip.text"]],
xanchor = "left", yanchor = "middle"
)
gglayout$annotations <- c(gglayout$annotations, row_lab)
strip <- make_strip_rect(xdom, ydom, theme, "right")
gglayout$shapes <- c(gglayout$shapes, strip)
}
}
}
} # end of panel loop
Expand Down
41 changes: 41 additions & 0 deletions tests/testthat/test-ggplot-facets.R
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,47 @@ test_that("facet_grid translates simple labeller function", {
)
})

g <- ggplot(mtcars, aes(mpg, wt)) +
geom_point() +
facet_wrap( ~ vs + am, labeller = function(x) label_both(x, multi_line = FALSE))

test_that("facet_wrap accounts for multi_line=FALSE", {
info <- expect_doppelganger_built(g, "facet_wrap-labeller-no-multi-line")
txt <- sapply(info$layout$annotations, "[[", "text")
expect_true(all(!grepl("expression(list())", txt, fixed = TRUE)))
expect_true(
all(c("vs, am: 0, 0", "vs, am: 0, 1", "vs, am: 1, 0", "vs, am: 1, 1") %in% txt)
)
expect_identical(length(txt), 6L)
})

g <- ggplot(mtcars, aes(mpg, wt)) +
geom_point()

g_no_col <- g +
facet_grid(vs + am ~ ., labeller = function(x) label_both(x, multi_line = FALSE))

g_no_row <- g +
facet_grid(. ~ vs + am, labeller = function(x) label_both(x, multi_line = FALSE))

test_that("facet_grid accounts for multi_line=FALSE", {
info <- expect_doppelganger_built(g_no_col, "facet_grid-labeller-no-col")
txt <- sapply(info$layout$annotations, "[[", "text")
expect_true(all(!grepl("expression(list())", txt, fixed = TRUE)))
expect_true(
all(c("vs, am: 0, 0", "vs, am: 0, 1", "vs, am: 1, 0", "vs, am: 1, 1") %in% txt)
)
expect_identical(length(txt), 6L)

info <- expect_doppelganger_built(g_no_row, "facet_grid-labeller-no-col")
txt <- sapply(info$layout$annotations, "[[", "text")
expect_true(all(!grepl("expression(list())", txt, fixed = TRUE)))
expect_true(
all(c("vs, am: 0, 0", "vs, am: 0, 1", "vs, am: 1, 0", "vs, am: 1, 1") %in% txt)
)
expect_identical(length(txt), 6L)
})

p <- economics %>% tidyr::gather(variable, value, -date) %>%
qplot(data = ., date, value) +
facet_wrap(~variable, scale = "free_y", ncol = 2)
Expand Down

0 comments on commit 9352fd4

Please sign in to comment.