ggplot2正负值不同的颜色渐变

Nie*_*sen 3 r ggplot2

我使用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)))
Run Code Online (Sandbox Code Playgroud)

Bri*_*ggs 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)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

指南中没有物理中断,但颜色按照您的描述进行映射.


小智 7

我不确定添加了哪个版本的ggplot2,但现在有内置的功能:

p <- ggplot(data =  dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) +
    scale_fill_gradient2()
Run Code Online (Sandbox Code Playgroud)

  • `scale_fill_gradient2` 并不是新的;它从 1.0 版本之前就已经可用。对于需要指定中点/零颜色的简单问题,它效果很好。然而,它提供了从高点到中点到低点的平滑过渡。最初的问题不仅希望中点是白色,而且希望在用于正值和负值的色阶之间有一个有效的突破(这样一点正值不仅仅是与白色有一点不同) 。这就是为什么我根据“scale_fill_gradientn”创建了一个答案。 (2认同)