Herman Toothrot
Herman Toothrot

Reputation: 1533

Ggplot center color scale at zero in scale_fill_stepsn

Working data

m=raster(ncol=10,nrow=10)
m[,]=runif(100, -0.8, 0.5)
tmp=data.table(as.data.frame(m,xy=TRUE))
ggplot()+ geom_tile(data = tmp, aes(x = x, y = y ,fill=layer)) +
scale_fill_stepsn(colors=c('#b2182b','#ef8a62','#fddbc7','#f7f7f7','#d1e5f0','#67a9cf','#2166ac'),n.breaks=10)

However this doesn't center at zero as some negative values are blue enter image description here

I am trying to plot multiple figures that show data somewhere between -1 and +1, however most of the figures' data are not centered around zero because the positive or negative data have a larger range. In the plot I would like positive values to be shown in blue and positive values in red and to control the binnes to be 0.1 or 0.2 apart.

How do I programmatically force the color scale in scale_fill_stepsn to be centered at zero without fiddling all the time with breaks? I have tried to play with n.breaks and tried scale_fill_steps2 with which I don't have much control on the color scale.

Upvotes: 3

Views: 3036

Answers (1)

Marco Sandri
Marco Sandri

Reputation: 24262

In my opinion a symmetric scale centered around zero could be a good solution.

library(raster)
library(data.table)
library(ggplot2)

set.seed(12345)
m <- raster(ncol=10,nrow=10)
m[,] <- runif(100, -0.8, 0.5)
tmp <- data.table(as.data.frame(m,xy=TRUE))
lmt <- ceiling(10*max(abs(range(tmp$layer))))/10

ggplot()+ 
  geom_tile(data = tmp, aes(x = x, y = y ,fill=layer)) +
  scale_fill_stepsn(colors=c('#b2182b','#ef8a62','#fddbc7',
                             '#f7f7f7','#d1e5f0','#67a9cf','#2166ac'),
             n.breaks=10, limits=c(-lmt,lmt), show.limits=T)

enter image description here

Upvotes: 5

Related Questions