【问题标题】:ggplot2 positive and negative values different color gradientggplot2正负值不同颜色渐变
【发布时间】:2013-09-09 14:46:04
【问题描述】:

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

【问题讨论】:

  • 正是我想做的事情......
  • 查看此线程:link。有一个在同一个图中使用两个比例梯度的例子。

标签: r ggplot2


【解决方案1】:

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

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

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

【讨论】:

  • 仅供所有其他搜索者参考:下面基思的答案反映了新的 ggplot2 函数,它可以自动、干净地执行此操作
  • @Will scale_fill_gradient2 不是新功能;它从一开始就在那里。但是,它并不能完全满足问题的要求。
【解决方案2】:

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

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

【讨论】:

  • 感谢您指出该功能的存在,让事情变得更容易!
  • scale_fill_gradient2 不是新的;它从 1.0 版之前就已经可用。对于需要指定中点/零颜色的简单问题,它运行良好。但是,它提供了从高点到中点到低点的平滑过渡。最初的问题是不仅希望中点为白色,而且希望在用于正负的色标之间有一个有效的中断(这样一点正点就不仅仅是一点点不同于白色) .这就是为什么我根据scale_fill_gradientn 创建了一个答案。
【解决方案3】:

您总是可以在绘图时稍微填充结果,以完全避免白色范围,并且只为 0 左右的数字显示浅黄色和浅青色:

dat$Y2 <- ifelse(dat$Y > 0, dat$Y + .25, ifelse(dat$Y < 0, dat$Y-.25,dat$Y))

【讨论】:

  • 感谢您的评论,但我不明白这如何解决跨零的连续区域的问题,而我希望在零处有一个离散的中断。
  • 只有当 Y 值在 0 的某个范围内时,这些框才会显示为白色(我不确定确切的范围,但 ±.25 在这里可以正常工作)。您只需将所有点从 0 移开一个小常数,就不会再有任何白框了。原来 -.0001 的框现在将变为 -.2501,并显示为浅青色而不是白色。
  • 感谢您的帮助,确实可行。不幸的是,对于我的项目,我无法按照您的建议更改值。
  • Brian Diggs 的答案是我试图找到一种方法,但无法完全弄清楚。他的解决方案绝对是可取的。
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 2020-09-24
  • 2018-03-24
相关资源
最近更新 更多