6

我正在使用 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)))
4

3 回答 3

10

我不确定这是添加了什么版本的 ggplot2,但现在有内置功能:

p <- ggplot(data =  dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) +
    scale_fill_gradient2()
于 2014-02-19T21:51:16.847 回答
10

使青色和黄色之间的范围非常小:

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)))

在此处输入图像描述

该指南没有物理中断,但您描述的颜色映射。

于 2013-09-13T20:00:12.007 回答
2

绘制图形时,您始终可以稍微填充结果,以完全避免白色范围,并专门为 0 左右的数字显示浅黄色和浅青色:

dat$Y2 <- ifelse(dat$Y > 0, dat$Y + .25, ifelse(dat$Y < 0, dat$Y-.25,dat$Y))
于 2013-09-09T15:48:01.397 回答