Градиент градиента ggplot для диапазона вне диапазона данных

Я ищу способ растянуть градиент цвета между двумя значениями и пометить легенду, независимо от диапазона значений данных в наборе данных. По существу, существует ли функциональный эквивалент ylim() для цветовых градиентов?

Данный код, который отображает значение z, как правило, между -1 и 1, я могу построить и наметить градиент, если разрывы находятся в пределах диапазона данных:

require(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)
  df
}

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

graham jeffries ggplot scale fill example

Но когда я меняю разрывы на значения за пределами наблюдаемого диапазона, окраска градиента, похоже, не корректируется, и метки градиента не отображаются.

b <- c(-3,0,3)

graham jeffries ggplot scale fill example 2

Ответы

Ответ 1

Очень важно помнить, что в 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))

И теперь, если вы хотите, чтобы разрывы, которые появляются в легенде, расширяются дальше, вы можете изменить их, чтобы установить, где появятся отметки.

Хорошая аналогия, которую следует иметь в виду, всегда является регулярной осью х и у. Установка "перерывов" там просто изменится, где появятся отметки. Если вы хотите изменить масштаб осей x или y, вы обычно изменяете настройку, как их "пределы".