web-dev-qa-db-fra.com

ggplot redimensionne le dégradé de couleurs pour se situer en dehors de la plage de données

Je recherche un moyen d'étirer un dégradé de couleurs entre deux valeurs et d'étiqueter la légende, quelle que soit la plage de valeurs de données dans l'ensemble de données. Existe-t-il essentiellement un équivalent fonctionnel à ylim() pour les dégradés de couleurs?

Étant donné le code qui trace une valeur z généralement comprise entre -1 et 1, je peux tracer et étiqueter un gradient si les ruptures sont dans la plage de données:

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)

graham jeffries ggplot scale fill example

Mais lorsque je modifie les coupures en valeurs en dehors de la plage observée, la coloration du dégradé ne semble pas s'ajuster et les étiquettes de dégradé n'apparaissent pas.

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

graham jeffries ggplot scale fill example 2

28
metasequoia

Il est très important de se rappeler que dans ggplot, breaks ne changera fondamentalement jamais l'échelle elle-même. Cela ne changera que ce qui est affiché dans le guide ou la légende.

Vous devriez plutôt modifier les limites de l'échelle:

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

Et maintenant, si vous souhaitez que les ruptures qui apparaissent dans la légende se prolongent, vous pouvez les modifier pour définir où les graduations apparaissent.

Une bonne analogie à garder à l'esprit est toujours les axes x et y réguliers. La définition de "pauses" ne fera que changer l'endroit où les graduations apparaissent. Si vous souhaitez modifier étendue des axes x ou y, vous devez généralement modifier un paramètre comme leurs "limites".

50
joran