web-dev-qa-db-fra.com

Existe-t-il un moyen intégré de faire une échelle de couleurs logarithmique dans ggplot2?

Voici un exemple de tracé de densité groupé:

require(ggplot2)
n <- 1e5
df <- data.frame(x = rexp(n), y = rexp(n))
p <- ggplot(df, aes(x = x, y = y)) + stat_binhex()
print(p)

enter image description here

Ce serait bien d'ajuster l'échelle de couleurs de sorte que les pauses soient espacées, mais essayez

my_breaks <- round_any(exp(seq(log(10), log(5000), length = 5)), 10)
p + scale_fill_hue(breaks = as.factor(my_breaks), labels = as.character(my_breaks))

Résultats dans une Error: Continuous variable () supplied to discrete scale_hue. Il semble que les pauses s'attendent à un facteur (peut-être?) Et conçues avec des variables catégorielles à l'esprit?

Il y a une solution de contournement non intégrée que je publierai comme réponse, mais je pense que je pourrais être perdu dans mon utilisation de scale_fill_hue, Et j'aimerais savoir s'il y a quelque chose d'évident que je suis disparu.

58
Gregor

Oui! Il y a un argument trans dans scale_fill_gradient, Que j'avais manqué auparavant. Avec cela, nous pouvons obtenir une solution avec une légende et une échelle de couleurs appropriées et une syntaxe concise agréable. En utilisant p à partir de la question et my_breaks = c(2, 10, 50, 250, 1250, 6000):

p + scale_fill_gradient(name = "count", trans = "log",
                        breaks = my_breaks, labels = my_breaks)

enter image description here

Mon autre réponse est mieux utilisée pour les fonctions plus compliquées des données. Le commentaire de Hadley m'a encouragé à trouver cette réponse dans les exemples au bas de ?scale_gradient.

104
Gregor

Une autre façon, en utilisant une fonction personnalisée dans stat_summary_hex:

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + 
  stat_summary_hex(function(z){log(sum(z))})

Cela fait maintenant partie de ggplot, mais était à l'origine inspiré par le merveilleux code de @kohske dans cette réponse , qui fournissait un stat_aggrhex Personnalisé. Dans les versions de ggplot> 2.0, utilisez le code ci-dessus (ou l'autre réponse)

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) +
    stat_aggrhex(fun = function(z) log(sum(z))) +
    labs(fill = "Log counts")

Pour générer ce tracé.

enter image description here

19
Gregor