From c9835e2cb23c5709b4849d5b94151c2301a73937 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Tue, 23 Apr 2019 11:42:52 +0200 Subject: [PATCH 1/2] Add warning when raster data doesn't fall on an even grid --- R/geom-raster.r | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/R/geom-raster.r b/R/geom-raster.r index fac51e9345..6c5ca1c13d 100644 --- a/R/geom-raster.r +++ b/R/geom-raster.r @@ -52,8 +52,20 @@ GeomRaster <- ggproto("GeomRaster", Geom, hjust <- params$hjust %||% 0.5 vjust <- params$vjust %||% 0.5 - w <- resolution(data$x, FALSE) - h <- resolution(data$y, FALSE) + x_diff <- diff(sort(unique(data$x))) + if (!length(unique(x_diff)) == 1) { + warning("Raster pixels are placed at uneven horizontal intervals and will be shifted. Consider using geom_tile() instead.") + w <- min(x_diff) + } else { + w <- x_diff[1] + } + y_diff <- diff(sort(unique(data$y))) + if (!length(unique(x_diff)) == 1) { + warning("Raster pixels are placed at uneven vertical intervals and will be shifted. Consider using geom_tile() instead.") + h <- min(y_diff) + } else { + h <- y_diff[1] + } data$xmin <- data$x - w * (1 - hjust) data$xmax <- data$x + w * hjust From cd6cf69b540edf510c4e25e0270ee88944de6d33 Mon Sep 17 00:00:00 2001 From: Thomas Lin Pedersen Date: Wed, 24 Apr 2019 10:45:39 +0200 Subject: [PATCH 2/2] Improve checks for grid uniformity --- R/geom-raster.r | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/R/geom-raster.r b/R/geom-raster.r index 6c5ca1c13d..37828083ee 100644 --- a/R/geom-raster.r +++ b/R/geom-raster.r @@ -49,18 +49,23 @@ GeomRaster <- ggproto("GeomRaster", Geom, required_aes = c("x", "y"), setup_data = function(data, params) { + precision <- sqrt(.Machine$double.eps) hjust <- params$hjust %||% 0.5 vjust <- params$vjust %||% 0.5 - x_diff <- diff(sort(unique(data$x))) - if (!length(unique(x_diff)) == 1) { + x_diff <- diff(sort(unique(as.numeric(data$x)))) + if (length(x_diff) == 0) { + w <- 1 + } else if (any(abs(diff(x_diff)) > precision)) { warning("Raster pixels are placed at uneven horizontal intervals and will be shifted. Consider using geom_tile() instead.") w <- min(x_diff) } else { w <- x_diff[1] } - y_diff <- diff(sort(unique(data$y))) - if (!length(unique(x_diff)) == 1) { + y_diff <- diff(sort(unique(as.numeric(data$y)))) + if (length(y_diff) == 0) { + h <- 1 + } else if (any(abs(diff(y_diff)) > precision)) { warning("Raster pixels are placed at uneven vertical intervals and will be shifted. Consider using geom_tile() instead.") h <- min(y_diff) } else {