Skip to content

Commit 533f635

Browse files
authored
Performance improvement on layers without positional scales (#4990)
* Improve performance of layers without positional scales * Add NEWS entry
1 parent aa2ddbe commit 533f635

File tree

3 files changed

+32
-16
lines changed

3 files changed

+32
-16
lines changed

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
* A stacking bug in `stat_align()` was fixed (@teunbrand, #5176).
7070
* `stat_contour()` and `stat_contour_filled()` now warn about and remove
7171
duplicated coordinates (@teunbrand, #5215).
72+
* Improve performance of layers without positional scales (@zeehio, #4990)
7273

7374
# ggplot2 3.4.2
7475
This is a hotfix release anticipating changes in r-devel, but folds in upkeep

R/facet-.R

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,27 @@ Facet <- ggproto("Facet", NULL,
101101
train_scales = function(x_scales, y_scales, layout, data, params) {
102102
# loop over each layer, training x and y scales in turn
103103
for (layer_data in data) {
104-
match_id <- match(layer_data$PANEL, layout$PANEL)
104+
match_id <- NULL
105105

106106
if (!is.null(x_scales)) {
107107
x_vars <- intersect(x_scales[[1]]$aesthetics, names(layer_data))
108-
SCALE_X <- layout$SCALE_X[match_id]
109-
110-
scale_apply(layer_data, x_vars, "train", SCALE_X, x_scales)
108+
if (length(x_vars) > 0) {
109+
match_id <- match(layer_data$PANEL, layout$PANEL)
110+
SCALE_X <- layout$SCALE_X[match_id]
111+
scale_apply(layer_data, x_vars, "train", SCALE_X, x_scales)
112+
}
111113
}
112114

113115
if (!is.null(y_scales)) {
114116
y_vars <- intersect(y_scales[[1]]$aesthetics, names(layer_data))
115-
SCALE_Y <- layout$SCALE_Y[match_id]
116-
117-
scale_apply(layer_data, y_vars, "train", SCALE_Y, y_scales)
117+
if (length(y_vars) > 0) {
118+
if (is.null(match_id)) {
119+
match_id <- match(layer_data$PANEL, layout$PANEL)
120+
}
121+
SCALE_Y <- layout$SCALE_Y[match_id]
122+
123+
scale_apply(layer_data, y_vars, "train", SCALE_Y, y_scales)
124+
}
118125
}
119126
}
120127
},

R/layout.R

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,21 +151,29 @@ Layout <- ggproto("Layout", NULL,
151151
layout <- self$layout
152152

153153
lapply(data, function(layer_data) {
154-
match_id <- match(layer_data$PANEL, layout$PANEL)
154+
match_id <- NULL
155155

156156
# Loop through each variable, mapping across each scale, then joining
157157
# back together
158158
x_vars <- intersect(self$panel_scales_x[[1]]$aesthetics, names(layer_data))
159-
names(x_vars) <- x_vars
160-
SCALE_X <- layout$SCALE_X[match_id]
161-
new_x <- scale_apply(layer_data, x_vars, "map", SCALE_X, self$panel_scales_x)
162-
layer_data[, x_vars] <- new_x
159+
if (length(x_vars) > 0) {
160+
match_id <- match(layer_data$PANEL, layout$PANEL)
161+
names(x_vars) <- x_vars
162+
SCALE_X <- layout$SCALE_X[match_id]
163+
new_x <- scale_apply(layer_data, x_vars, "map", SCALE_X, self$panel_scales_x)
164+
layer_data[, x_vars] <- new_x
165+
}
163166

164167
y_vars <- intersect(self$panel_scales_y[[1]]$aesthetics, names(layer_data))
165-
names(y_vars) <- y_vars
166-
SCALE_Y <- layout$SCALE_Y[match_id]
167-
new_y <- scale_apply(layer_data, y_vars, "map", SCALE_Y, self$panel_scales_y)
168-
layer_data[, y_vars] <- new_y
168+
if (length(y_vars) > 0) {
169+
if (is.null(match_id)) {
170+
match_id <- match(layer_data$PANEL, layout$PANEL)
171+
}
172+
names(y_vars) <- y_vars
173+
SCALE_Y <- layout$SCALE_Y[match_id]
174+
new_y <- scale_apply(layer_data, y_vars, "map", SCALE_Y, self$panel_scales_y)
175+
layer_data[, y_vars] <- new_y
176+
}
169177

170178
layer_data
171179
})

0 commit comments

Comments
 (0)