我使用的是R(3.0.1)和ggplot2(0.9.3.1)。我有包含正值和负值的数据,我想获得一个geom_tile图,其中正数和负数有不同的颜色标度渐变(例如,正数从红色变为黄色,负数从蓝色到负数)青色)。我能够使用scale_fill_gradientn(见下文)接近我想要的东西,但这导致一个连续的渐变,在中点(0)包括“白色”。我需要避免这些中点颜色,因此不知何故需要在零处“破坏”渐变。换句话说,我需要两个连续的梯度(一个用于正值,一个用于负值),其具有零离散度。有什么帮助吗?
dat <- data.frame(Row = rep(x = LETTERS[1:5], times = 10)
, Col = rep(x = LETTERS[1:10], each = 5)
, Y = runif(n = 50, min = -1, max = 1))
p <- ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradientn(colours=c("blue","cyan","white", "yellow","red"), values=rescale(c(-1,0,1)))
答案 0 :(得分:9)
使青色和黄色之间的范围非常小:
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradientn(colours=c("blue","cyan","white", "yellow","red"),
values=rescale(c(-1,0-.Machine$double.eps,0,0+.Machine$double.eps,1)))
指南中没有物理中断,但颜色按照您的描述进行映射。
答案 1 :(得分:7)
我不确定添加了哪个版本的ggplot2,但现在有内置的功能:
p <- ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradient2()
答案 2 :(得分:2)
您可以在绘图时稍微填充结果,以便完全避免白色范围,并且仅为0左右的数字专门显示浅黄色和浅青色:
dat$Y2 <- ifelse(dat$Y > 0, dat$Y + .25, ifelse(dat$Y < 0, dat$Y-.25,dat$Y))