Skip to content

Commit f65b274

Browse files
committed
support free scales for multiple rows (which really fixes #317)
1 parent f11482b commit f65b274

File tree

3 files changed

+25
-29
lines changed

3 files changed

+25
-29
lines changed

Diff for: R/ggplotly.R

+20-26
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ gg2list <- function(p) {
243243
# Add ROW and COL to df: needed to link axes to traces; keep df's
244244
# original ordering while merging.
245245
df$order <- seq_len(nrow(df))
246-
df <- merge(df, gglayout[, c("PANEL", "plotly.row", "COL")])
246+
df <- merge(df, gglayout[, c("PANEL", "plotly.row", "plotly.panel", "COL")])
247247
df <- df[order(df$order),]
248248
df$order <- NULL
249249

@@ -503,13 +503,14 @@ gg2list <- function(p) {
503503
# copy [x/y]axis to [x/y]axisN and set domain, range, etc. for each
504504
xaxis.title <- layout$xaxis$title
505505
yaxis.title <- layout$yaxis$title
506-
inner.margin <- 0.01 # between facets
506+
inner.margin <- 0.02 # between facets
507507
outer.margin <- 0.05 # to put titles outside of the plots
508508
orig.xaxis <- layout$xaxis
509509
orig.yaxis <- layout$yaxis
510510
if (nrow(gglayout) > 1) {
511-
row.size <- 1. / max(gglayout$ROW)
512-
col.size <- 1. / max(gglayout$COL)
511+
# TODO: make this a function of the range of space="free"
512+
row.size <- 1 / max(gglayout$ROW)
513+
col.size <- 1 / max(gglayout$COL)
513514
npanels <- nrow(gglayout)
514515
for (i in seq_len(npanels)) {
515516
row <- gglayout[i, "plotly.row"]
@@ -521,12 +522,10 @@ gg2list <- function(p) {
521522
y <- row * row.size
522523
ymin <- y - row.size
523524
ymax <- y - inner.margin
524-
# assume grid layout by default where axes are restrict to the exterior
525-
xaxis.name <- if (col == 1) "xaxis" else paste0("xaxis", col)
526-
yaxis.name <- if (row == 1) "yaxis" else paste0("yaxis", row)
527-
# anchor needs to be incremented if the corresponding axis is "free"
528-
xanchor <- "y"
529-
yanchor <- "x"
525+
xaxis.name <- sub("1$", "", paste0("xaxis", panel))
526+
yaxis.name <- sub("1$", "", paste0("yaxis", panel))
527+
xanchor <- sub("1$", "", paste0("y", panel))
528+
yanchor <- sub("1$", "", paste0("x", panel))
530529
if ("wrap" %in% class(p$facet)) {
531530
# in wrap layout, axes can be drawn on interior (if scales are free)
532531
# make room for facet strip label
@@ -539,33 +538,28 @@ gg2list <- function(p) {
539538
}
540539
# make room for xaxis labels
541540
if (row == 1) {
542-
ymax <- ymax - 0.02
541+
ymax <- ymax - 0.06
543542
} else {
544-
ymin <- ymin + 0.02
543+
ymin <- ymin + 0.06
545544
}
546545
if (p$facet$free$y && panel > 1) {
547-
# draw a y-axis on each panel
548-
yaxis.name <- paste0("yaxis", panel)
549546
for (j in seq_along(trace.list)) {
550-
tr <- trace.list[[j]]
551-
if (tr$PANEL == panel) {
552-
trace.list[[j]]$yaxis <- paste0("y", panel)
553-
}
547+
trace.list[[j]]$yaxis <- paste0("y", trace.list[[j]]$PANEL)
548+
}
549+
if (!p$facet$free$x) {
550+
layout[[paste0("xaxis", panel)]]$showticklabels <- FALSE
554551
}
555-
yanchor <- if (p$facet$free$x) paste0("x", panel) else paste0("x",col)
556552
}
557553
if (p$facet$free$x && panel > 1) {
558-
# draw an x-axis on each panel
559-
xaxis.name <- paste0("xaxis", panel)
560554
for (j in seq_along(trace.list)) {
561-
tr <- trace.list[[j]]
562-
if (tr$PANEL == panel) {
563-
trace.list[[j]]$xaxis <- paste0("x", panel)
564-
}
555+
trace.list[[j]]$xaxis <- paste0("x", trace.list[[j]]$PANEL)
556+
}
557+
if (!p$facet$free$y) {
558+
layout[[paste0("xaxis", panel)]]$showticklabels <- FALSE
565559
}
566-
xanchor <- if (p$facet$free$y) paste0("y", panel) else paste0("y",row)
567560
}
568561
}
562+
#if (xaxis.name == "xaxis") browser()
569563
layout[[xaxis.name]] <- orig.xaxis
570564
layout[[xaxis.name]]$domain <- c(xmin, xmax)
571565
layout[[xaxis.name]]$anchor <- xanchor

Diff for: R/trace_generation.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ layer2traces <- function(l, d, misc) {
220220
if ("PANEL" %in% names(dpd) && nrow(dpd) > 0) {
221221
tr$xaxis <- paste0("x", dpd[1, "COL"])
222222
tr$yaxis <- paste0("y", dpd[1, "plotly.row"])
223-
tr$PANEL <- dpd[1, "PANEL"]
223+
tr$PANEL <- dpd[1, "plotly.panel"]
224224
}
225225

226226
if (is.null(tr$name) || tr$name %in% names.in.legend)

Diff for: tests/testthat/test-ggplot-facets.R

+4-2
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,13 @@ test_that("facet_grid(..., scales = 'free') doesnt create interior scales.", {
9595

9696
gg <- ggplot(mtcars, aes(mpg, wt)) +
9797
geom_point() + geom_line() +
98-
facet_wrap(~vs, scales = "free")
98+
facet_wrap(~cyl, scales = "free", ncol = 2)
9999

100100
test_that("facet_wrap(..., scales = 'free') can handle multiple traces on each panel", {
101101
info <- save_outputs(gg, "facet_wrap_free_mult")
102102
yaxes <- sapply(info$data, "[[", "yaxis")
103103
modes <- sapply(info$data, "[[", "mode")
104-
expect_true(length(unique(paste(yaxes, modes))) == 4)
104+
for (i in sub("y", "", unique(yaxes))) {
105+
expect_equal(sort(modes[grepl(i, yaxes)]), c("lines", "markers"))
106+
}
105107
})

0 commit comments

Comments
 (0)