I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance. Don McKenzie Research Ecologist Pacific Wildland Fire Sciences Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
divergent colors around zero in levelplot()
9 messages · Bert Gunter, Achim Zeileis, Don McKenzie +1 more
Use the Rcolorbrewer package. -- Bert
On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu> wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance. Don McKenzie Research Ecologist Pacific Wildland Fire Sciences Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Thanks Bert. I?ll check it out. Don
On Nov 22, 2013, at 10:25 PM, Bert Gunter <gunter.berton at gene.com> wrote:
Use the Rcolorbrewer package. -- Bert On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu> wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance. Don McKenzie Research Ecologist Pacific Wildland Fire Sciences Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
-- Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Don McKenzie Research Ecologist Pacific WIldland Fire Sciences Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences College of the Environment University of Washington dmck at uw.edu
On Fri, 22 Nov 2013, Don McKenzie wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance.
One approach is to limit the range of colors (to match the range of the data) as you suggest above. The other approach is to extend the range of the legend (beyond the range of the data). For example: levelplot(z ~ x*y, grid, at = seq(-12, 12, length = 100)) This produces a legend that is symmetric around zero. For other/better diverging color palettes, you can use the RColorBrewer package (as suggested by Bert) or the colorspace package (see e.g., its graphical choose_color() tool).
Don McKenzie Research Ecologist Pacific Wildland Fire Sciences Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
2 days later
Bert or anyone else familiar with RColorBrewer:
Has anyone tried to accomplish with RColorBrewer what I asked about in my original post (below)?
Here is an example cribbed from the levelplot() help examples
x <- seq(pi/4, 5 * pi, length.out = 100)
y <- seq(pi/4, 5 * pi, length.out = 100)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r^2) * exp(-r/(pi^3))
# now use RColorBrewer to get a palette
library("RColorBrewer?)
levelplot(z~x*y, grid,col.regions=brewer.pal(6,"BrBG?)) # the numeric argument to brewer.pal is the number of colors used ? I tried several
This gives me a nice brown-to-green gradient but does not (AFAICS) give me control over where the center of the divergence lies. Even in this symmetrical
example, I can?t get it to be at zero ? it repeats on either side of zero.
thanks to anyone who pages through all this and makes a suggestion, even if it doesn?t work. :-)
On Nov 22, 2013, at 10:25 PM, Bert Gunter <gunter.berton at gene.com> wrote:
Use the Rcolorbrewer package. -- Bert On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu> wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance.
Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
Never mind. Solved. ?cuts? argument back in levelplot(). Duh.
On Nov 25, 2013, at 4:27 PM, Don McKenzie <dmck at u.washington.edu> wrote:
Bert or anyone else familiar with RColorBrewer:
Has anyone tried to accomplish with RColorBrewer what I asked about in my original post (below)?
Here is an example cribbed from the levelplot() help examples
x <- seq(pi/4, 5 * pi, length.out = 100)
y <- seq(pi/4, 5 * pi, length.out = 100)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r^2) * exp(-r/(pi^3))
# now use RColorBrewer to get a palette
library("RColorBrewer?)
levelplot(z~x*y, grid,col.regions=brewer.pal(6,"BrBG?)) # the numeric argument to brewer.pal is the number of colors used ? I tried several
This gives me a nice brown-to-green gradient but does not (AFAICS) give me control over where the center of the divergence lies. Even in this symmetrical
example, I can?t get it to be at zero ? it repeats on either side of zero.
thanks to anyone who pages through all this and makes a suggestion, even if it doesn?t work. :-)
On Nov 22, 2013, at 10:25 PM, Bert Gunter <gunter.berton at gene.com> wrote:
Use the Rcolorbrewer package. -- Bert On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu> wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance.
Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20131125/0e6703a9/attachment.pl>
In case anyone cares (?), here is a function to do what I was asking, which doesn?t use colorBrewer but could with some hacking. I?m sure it?s fragile, but it works with well behaved integers and zero in the middle, which was all I needed. The output is a palette that can be passed to levelplot() and other functions.
Cheers
diverge.color <- function(start.color,end.color,min.value,max.value,mid.value=0,mid.color="ivory")
{
# based on ideas from Maureen Kennedy, Nick Povak, and Alina Cansler
# creates a palette for the current session for a divergent-color
# graphic with a non-symmetric range
# "cuts" = the number of slices to be made in the range above and below "mid.value"
ramp1 <- colorRampPalette(c(start.color,mid.color))
ramp2 <- colorRampPalette(c(mid.color,end.color))
# now specify the number of values on either side of "mid.value"
max.breaks <- round(max.value - mid.value)
min.breaks <- round(mid.value - min.value)
num.breaks <- max(max.breaks,min.breaks)
low.ramp <- ramp1(num.breaks)
high.ramp <- ramp2(num.breaks)
# now create a combined ramp from the higher values of "low.ramp" and
# the lower values of "high.ramp", with the longer one using all values
# high.ramp starts at 2 to avoid duplicating zero
myColors <- c(low.ramp[(num.breaks-min.breaks):num.breaks],high.ramp[2:max.breaks])
myColors
}
On Nov 25, 2013, at 4:27 PM, Don McKenzie <dmck at u.washington.edu> wrote:
Bert or anyone else familiar with RColorBrewer:
Has anyone tried to accomplish with RColorBrewer what I asked about in my original post (below)?
Here is an example cribbed from the levelplot() help examples
x <- seq(pi/4, 5 * pi, length.out = 100)
y <- seq(pi/4, 5 * pi, length.out = 100)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r^2) * exp(-r/(pi^3))
# now use RColorBrewer to get a palette
library("RColorBrewer?)
levelplot(z~x*y, grid,col.regions=brewer.pal(6,"BrBG?)) # the numeric argument to brewer.pal is the number of colors used ? I tried several
This gives me a nice brown-to-green gradient but does not (AFAICS) give me control over where the center of the divergence lies. Even in this symmetrical
example, I can?t get it to be at zero ? it repeats on either side of zero.
thanks to anyone who pages through all this and makes a suggestion, even if it doesn?t work. :-)
On Nov 22, 2013, at 10:25 PM, Bert Gunter <gunter.berton at gene.com> wrote:
Use the Rcolorbrewer package. -- Bert On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu> wrote:
I would like to produce a levelplot with divergent colors such that increasingly negative values of Z get darker in the first color and increasingly positive values get darker in the second color. this is common in cartography. I have tried tinkering with the col.regions argument but the best I can do is to get the split in the middle of my range of Z, but in my particular case range(Z) is (-1,12). I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the split is at ~5.5 # do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be some light pink at the bottom and the rest increasingly intense blue Ideas appreciated. Thanks in advance.
Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
On Mon, 25 Nov 2013, C. Alina Cansler wrote:
Don, This looks helpful: https://stat.ethz.ch/pipermail/r-help/2011-March/272361.html Also, here is some code that I had, and tried to make applicable to your question: div.colors <-colorRampPalette(c("blue", "white", "red" )) x<-seq(-1,12,1);x palette(div.colors(length(x))) y<- rep(1,length(x)) barplot(y, col=x+2, space=0, axes=FALSE, border = NA , cex.names=1.3 , xlab="", ylab="",xaxt="n")
These colors are not very well balanced because "blue" is much darker than
"red". You can see that more clearly when you desaturate the colors where
the blue branch corresponds to darker colors than the red branch.
The palettes in RColorBrewer or colorspace offer better balanced palettes.
Consider the code below.
And as for the original question: diverge_hcl(99) would be one option to
obtain 99 divergent colors in "colorspace".
library("colorspace")
pal <- function(col, border = "light gray") {
n <- length(col)
plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1),
axes = FALSE, xlab = "", ylab = "")
rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}
par(mfrow = c(2, 2), mar = rep(1, 4))
pal(div.colors(9))
pal(diverge_hcl(9))
pal(desaturate(div.colors(9)))
pal(desaturate(diverge_hcl(9)))
-Alina On Mon, Nov 25, 2013 at 4:27 PM, Don McKenzie <dmck at u.washington.edu> wrote:
Bert or anyone else familiar with RColorBrewer:
Has anyone tried to accomplish with RColorBrewer what I asked about in my
original post (below)?
Here is an example cribbed from the levelplot() help examples
x <- seq(pi/4, 5 * pi, length.out = 100)
y <- seq(pi/4, 5 * pi, length.out = 100)
r <- as.vector(sqrt(outer(x^2, y^2, "+")))
grid <- expand.grid(x=x, y=y)
grid$z <- cos(r^2) * exp(-r/(pi^3))
# now use RColorBrewer to get a palette
library("RColorBrewer?)
levelplot(z~x*y, grid,col.regions=brewer.pal(6,"BrBG?)) # the numeric
argument to brewer.pal is the number of colors used ? I tried several
This gives me a nice brown-to-green gradient but does not (AFAICS) give me
control over where the center of the divergence lies. Even in this
symmetrical
example, I can?t get it to be at zero ? it repeats on either side of zero.
thanks to anyone who pages through all this and makes a suggestion, even
if it doesn?t work. :-)
On Nov 22, 2013, at 10:25 PM, Bert Gunter <gunter.berton at gene.com> wrote:
Use the Rcolorbrewer package. -- Bert On Fri, Nov 22, 2013 at 8:43 PM, Don McKenzie <dmck at u.washington.edu>
wrote:
I would like to produce a levelplot with divergent colors such that
increasingly negative values of Z get darker in the first color and increasingly
positive values get darker in the second color. this is common in
cartography. I have tried tinkering with the col.regions argument but the best I can do
is to get the split in the middle of my range of Z, but in my
particular case range(Z) is (-1,12).
I am using R 3.0.2 on OSX 10.9 Here is an example x <- y <- c(1:25) grid <- expand.grid(x=x,y=y) grid$z <- sort(runif(625,min=-1,max=12)) levelplot(z ~ x*y,grid) # produces the default pink and blue but the
split is at ~5.5
# do something clever here # e.g., my.colors <- <create a palette that splits at zero> levelplot(z ~ x*y,grid,col.regions=my.colors) # so there should be
some light pink at the bottom and the rest increasingly intense blue
Ideas appreciated. Thanks in advance.
Bert Gunter Genentech Nonclinical Biostatistics (650) 467-7374
Don McKenzie Research Ecologist Pacific Wildland Fire Science Lab US Forest Service Affiliate Professor School of Environmental and Forest Sciences University of Washington dmck at uw.edu
-- C. Alina Cansler Fire and Mountain Ecology Lab School of Environmental and Forest Sciences College of the Environment University of Washington E-mail: acansler at uw.edu Cell: 206-794-1630 [[alternative HTML version deleted]]