From 6fe3ceb687e9d44070b3583440b838e5a2578879 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Thu, 8 Apr 2021 12:18:44 +0200 Subject: [PATCH 1/3] Make sure jitter is only calculated once --- NEWS.md | 3 +++ R/position-jitter.r | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index a7fad64a3d..2ba413c9bc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,8 @@ # ggplot2 (development version) +* Fix a bug in `position_jitter()` where different jitters would be applied to + different position aesthetics of the same axis (@thomasp85, #2941) + * `coord_sf()` now has an argument `default_crs` that specifies the coordinate reference system (CRS) for non-sf layers and scale/coord limits. This argument defaults to the World Geodetic System 1984 (WGS84), which means x and y positions diff --git a/R/position-jitter.r b/R/position-jitter.r index 1e314aa2c1..7605ad545c 100644 --- a/R/position-jitter.r +++ b/R/position-jitter.r @@ -76,6 +76,11 @@ PositionJitter <- ggproto("PositionJitter", Position, trans_x <- if (params$width > 0) function(x) jitter(x, amount = params$width) trans_y <- if (params$height > 0) function(x) jitter(x, amount = params$height) - with_seed_null(params$seed, transform_position(data, trans_x, trans_y)) + # Make sure x and y jitter is only calculated once for all position aesthetics + dummy_data <- data.frame(x = rep(0, nrow(data)), y = rep(0, nrow(data))) + fixed_jitter <- with_seed_null(params$seed, transform_position(dummy_data, trans_x, trans_y)) + + # Apply jitter + transform_position(data, function(x) x + fixed_jitter$x, function(x) x + fixed_jitter$y) } ) From 1da8acf23697c58308de6d48ce16be678fe89ee0 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Fri, 9 Apr 2021 08:35:59 +0200 Subject: [PATCH 2/3] Use real data on jitter if available --- R/position-jitter.r | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/R/position-jitter.r b/R/position-jitter.r index 7605ad545c..933c93f426 100644 --- a/R/position-jitter.r +++ b/R/position-jitter.r @@ -77,10 +77,16 @@ PositionJitter <- ggproto("PositionJitter", Position, trans_y <- if (params$height > 0) function(x) jitter(x, amount = params$height) # Make sure x and y jitter is only calculated once for all position aesthetics - dummy_data <- data.frame(x = rep(0, nrow(data)), y = rep(0, nrow(data))) + x_aes <- intersect(names(data), ggplot_global$x_aes) + x <- if (length(x_aes) == 0) 0 else data[[x_aes[1]]] + y_aes <- intersect(names(data), ggplot_global$y_aes) + y <- if (length(y_aes) == 0) 0 else data[[y_aes[1]]] + dummy_data <- new_data_frame(list(x = x, y = y), nrow(data)) fixed_jitter <- with_seed_null(params$seed, transform_position(dummy_data, trans_x, trans_y)) + x_jit <- fixed_jitter$x - x + y_jit <- fixed_jitter$y - y # Apply jitter - transform_position(data, function(x) x + fixed_jitter$x, function(x) x + fixed_jitter$y) + transform_position(data, function(x) x + x_jit, function(x) x + y_jit) } ) From 1735fdca8f159b972130561481d55f3bac93701c Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Fri, 9 Apr 2021 08:58:06 +0200 Subject: [PATCH 3/3] Make sure to get primary aesthetic --- R/position-jitter.r | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/position-jitter.r b/R/position-jitter.r index 933c93f426..ece4465626 100644 --- a/R/position-jitter.r +++ b/R/position-jitter.r @@ -77,9 +77,9 @@ PositionJitter <- ggproto("PositionJitter", Position, trans_y <- if (params$height > 0) function(x) jitter(x, amount = params$height) # Make sure x and y jitter is only calculated once for all position aesthetics - x_aes <- intersect(names(data), ggplot_global$x_aes) + x_aes <- intersect(ggplot_global$x_aes, names(data)) x <- if (length(x_aes) == 0) 0 else data[[x_aes[1]]] - y_aes <- intersect(names(data), ggplot_global$y_aes) + y_aes <- intersect(ggplot_global$y_aes, names(data)) y <- if (length(y_aes) == 0) 0 else data[[y_aes[1]]] dummy_data <- new_data_frame(list(x = x, y = y), nrow(data)) fixed_jitter <- with_seed_null(params$seed, transform_position(dummy_data, trans_x, trans_y))