简体   繁体   English

R中心调色板为0

[英]R center color palette on 0

I would like to create a color ramp centered on 0. 我想创建一个以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. 其中“0”位于颜色渐变的浅蓝色部分。 Any advice on how to make it align with the white section? 有关如何使其与白色部分对齐的任何建议? I've struggled with using breaks to no avail. 我一直在努力使用休息无济于事。

Using this answer: https://stackoverflow.com/a/10986203/4632634 , I was able to get what I needed for my problem. 使用这个答案: https//stackoverflow.com/a/10986203/4632634 ,我能够得到我的问题所需。

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: 产生这个:

固定图像,0以色阶为中心

Where 0 is nicely centered on the white zone. 其中0很好地以白色区域为中心。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM