Reputation: 364
I would like to create a color ramp centered on 0.
The following code:
library(raster)
librayr(RColorBrewer)
xmin = -124.413
xmax = -66.883
ymin = 25.9425
ymax = 48.9885
nrows = 215
ncols = 254
empty_raster = raster(xmn=xmin, ymn=ymin, nrows = nrows, ncols = ncols)
zscores_coords = cbind(seq(from=-124.413, to=-66.883, length.out=1212),
seq(from=25.9425, to=48.9885, length.out=1212))
zscores_raster = rasterize(zscores_coords, empty_raster, field = 1)
x_coord_raster = rasterize(zscores_coords, zscores_raster,
field=zscores_coords[,1])
y_coord_raster = rasterize(zscores_coords, zscores_raster,
field=zscores_coords[,2])
BUD_zscores_coordinates =
data.frame(x = zscores_coords[,1], y = zscores_coords[,2],
BUD_zscores = seq(from=-20.51558, to=14.34510, length.out=1212))
coordinates(BUD_zscores_coordinates) = ~x+y
zscores_pres = rasterize(BUD_zscores_coordinates, zscores_raster, field=1)
zscores_points = rasterToPoints(zscores_pres)
zscores_points = zscores_points[,c(1:2)]
zscores_nodes = rasterize(BUD_zscores_coordinates, empty_raster,
field = BUD_zscores_coordinates$BUD_zscores,
fun = mean)
#Plot!
colorramp = brewer.pal(11,"RdBu")
applycolors = colorRampPalette(colorramp)
plot(zscores_nodes, xlim = c(xmin, xmax), ylim = c(ymin, ymax),
col = applycolors(100))
Produces the following graphic:
In which '0' is in the light blue section of the color ramp. Any advice on how to make it align with the white section? I've struggled with using breaks to no avail.
Upvotes: 4
Views: 6904
Reputation: 364
Using this answer: https://stackoverflow.com/a/10986203/4632634, I was able to get what I needed for my problem.
library(raster)
library(RColorBrewer)
xmin = -124.413
xmax = -66.883
ymin = 25.9425
ymax = 48.9885
nrows = 215
ncols = 254
empty_raster = raster(xmn=xmin, ymn=ymin, nrows = nrows, ncols = ncols)
zscores_coords = cbind(seq(from=-124.413, to=-66.883, length.out=1212),
seq(from=25.9425, to=48.9885, length.out=1212))
zscores_raster = rasterize(zscores_coords, empty_raster, field = 1)
x_coord_raster = rasterize(zscores_coords, zscores_raster,
field=zscores_coords[,1])
y_coord_raster = rasterize(zscores_coords, zscores_raster,
field=zscores_coords[,2])
BUD_zscores_coordinates =
data.frame(x = zscores_coords[,1], y = zscores_coords[,2],
BUD_zscores = seq(from=-20.51558, to=14.34510, length.out=1212))
coordinates(BUD_zscores_coordinates) = ~x+y
zscores_pres = rasterize(BUD_zscores_coordinates, zscores_raster, field=1)
zscores_points = rasterToPoints(zscores_pres)
zscores_points = zscores_points[,c(1:2)]
zscores_nodes = rasterize(BUD_zscores_coordinates, empty_raster,
field = BUD_zscores_coordinates$BUD_zscores,
fun = mean)
zscores_stack = stack(zscores_nodes, zscores_raster, x_coord_raster,
y_coord_raster)
zscores_table = extract(zscores_stack, zscores_points)
#Plot! (bluer = flyway zscores > eBird szcores; red = eBird zscores >
#flyway zscores)
nHalf = nrow(zscores_table)/2
Min = min(zscores_table[,1])
Max = max(zscores_table[,1])
Thresh = 0
## Make vector of colors for values below threshold
rc1 = colorRampPalette(colors = c("red", "white"), space="Lab")(nHalf)
## Make vector of colors for values above threshold
rc2 = colorRampPalette(colors = c("white", "blue"), space="Lab")(nHalf)
rampcols = c(rc1, rc2)
## In your example, this line sets the color for values between 49 and 51.
rampcols[c(nHalf, nHalf+1)] = rgb(t(col2rgb("white")), maxColorValue=256)
rb1 = seq(Min, Thresh, length.out=nHalf+1)
rb2 = seq(Thresh, Max, length.out=nHalf+1)[-1]
rampbreaks = c(rb1, rb2)
r.range = c(Min, Max)
plot(zscores_nodes, xlim = c(xmin, xmax), ylim = c(ymin, ymax),
col = rampcols, breaks=rampbreaks, legend.width = 1, legend.shrink = 0.75,
axis.args=list(at=c(-20, 0, 14), labels=c(-20, 0, 14),
cex.axis=0.6),
legend.args=list(text='Z-Score', side=4, font=2, line=2.5, cex=0.8))
Yielding this:
Where 0 is nicely centered on the white zone.
Upvotes: 4