ggplot缩放颜色渐变到数据范围之外的范围

met*_*oia 25 r data-visualization colors ggplot2

我正在寻找一种方法来拉伸两个值之间的颜色渐变并标记图例,而不管数据集中的数据值范围如何.基本上,是否有功能等同ylim() 于颜色渐变?

给定通常在-1和1之间绘制az值的代码,如果中断在数据范围内,我可以绘制并标记渐变:

library(ggplot2)

#generator from http://docs.ggplot2.org/current/geom_tile.html
pp <- function (n, r = 4) { 
  x <- seq(-r * pi, r * pi, len = n)
  df <- expand.grid(x = x, y = x)
  df$r <- sqrt(df$x^2 + df$y^2)
  df$z <- cos(df$r^2) * exp(-df$r / 6)
  return(df)
}

t <- pp(30)
summary(t)
b <- c(-.5, 0, .5)
colors <- c('navyblue', 'darkmagenta', 'darkorange1')
p <- ggplot(data = t, aes(x = x, y = y))+
  geom_tile(aes(fill = z))+
  scale_fill_gradientn(colors = colors, breaks = b, labels = format(b))
ggsave(plot = p, filename = <somefile.png>, height = 3, width = 4)
Run Code Online (Sandbox Code Playgroud)

格雷厄姆杰弗里斯ggplot规模填充示例

但是当我将断点更改为观察范围之外的值时,渐变着色似乎不会调整,并且渐变标签不会出现.

b <- c(-3, 0, 3)
Run Code Online (Sandbox Code Playgroud)

格雷厄姆杰弗里斯ggplot规模填充示例2

jor*_*ran 50

记住在ggplot中,breaks基本上永远不会改变比例本身是非常重要的.它只会更改指南或图例中显示的内容.

你应该改变比例的限制:

ggplot(data=t, aes(x=x, y=y)) +
  geom_tile(aes(fill=z)) +
  scale_fill_gradientn(limits = c(-3,3),
  colours=c("navyblue", "darkmagenta", "darkorange1"),
  breaks=b, labels=format(b))
Run Code Online (Sandbox Code Playgroud)

现在,如果您希望图例中出现的断点进一步延伸,您可以更改它们以设置刻度线出现的位置.

要记住的一个很好的类比是常规的x和y轴.设置"中断"只会改变刻度标记出现的位置.如果你要改变的程度 x或y轴的,你通常会改变他们一样的"极限"的设置.