Ceci est la suite d'une question que j'ai récemment posée (Manually assigning colors with scale_fill_manual only works for certain hexagon sizes).Tailles hexagonales cohérentes et légende pour l'attribution manuelle des couleurs
Je ne pouvais pas tracer geom_hex() de sorte que tous les hexagones avaient la même taille. Quelqu'un a résolu le problème. Cependant, leur solution a supprimé la clé de légende. Maintenant, je suis incapable de garder tous les hexagones de la même taille tout en conservant la légende.
Pour être précis, je veux vraiment garder les étiquettes légendaires. Dans l'exemple ci-dessous, la légende a des valeurs (0,2,4,6,8,20), plutôt que des étiquettes hexadécimales (# 08306B, # 08519C, etc.). Ci-dessous figure MWE illustrant le problème. À la fin, selon les 3 commentaires, vous pouvez voir que je suis capable de 1) Créer un complot avec des tailles hexagonales cohérentes, mais pas de légende, 2) Créer un complot avec la légende, mais les tailles hexagonales incohérentes, 3) Tentative de créer un parcelle avec des tailles hexagonaux cohérentes et légende, mais ne parviennent:
library(ggplot2)
library(hexbin)
library(RColorBrewer)
library(reshape)
set.seed(1)
xbins <- 10
x <- abs(rnorm(10000))
y <- abs(rnorm(10000))
minVal <- min(x, y)
maxVal <- max(x, y)
maxRange <- c(minVal, maxVal)
buffer <- (maxRange[2] - maxRange[1])/(xbins/2)
bindata = data.frame(x=x,y=y,factor=as.factor(1))
h <- hexbin(bindata, xbins = xbins, IDs = TRUE, xbnds = maxRange, ybnds = maxRange)
counts <- hexTapply (h, bindata$factor, table)
counts <- t (simplify2array (counts))
counts <- melt (counts)
colnames (counts) <- c ("factor", "ID", "counts")
counts$factor =as.factor(counts$factor)
hexdf <- data.frame (hcell2xy (h), ID = [email protected])
hexdf <- merge (counts, hexdf)
my_breaks <- c(2, 4, 6, 8, 20, 1000)
clrs <- brewer.pal(length(my_breaks) + 3, "Blues")
clrs <- clrs[3:length(clrs)]
hexdf$countColor <- cut(hexdf$counts, breaks = c(0, my_breaks, Inf), labels = rev(clrs))
# Has consistent hexagon sizes, but no legend
ggplot(hexdf, aes(x=x, y=y, hexID=ID, counts=counts, fill=countColor)) + geom_hex(stat="identity", fill=hexdf$countColor) + scale_fill_manual(labels = as.character(c(0, my_breaks)), values = rev(clrs), name = "Count") + geom_abline(intercept = 0, color = "red", size = 0.25) + labs(x = "A", y = "C") + coord_fixed(xlim = c(-0.5, (maxRange[2]+buffer)), ylim = c(-0.5, (maxRange[2]+buffer))) + theme(aspect.ratio=1)
# Has legend, but inconsistent hexagon sizes
ggplot(hexdf, aes(x=x, y=y, hexID=ID, counts=counts, fill=countColor)) + geom_hex(data=hexdf, stat="identity", aes(fill=countColor)) + scale_fill_manual(labels = as.character(c(0, my_breaks)), values = rev(clrs), name = "Count") + geom_abline(intercept = 0, color = "red", size = 0.25) + labs(x = "A", y = "C") + coord_fixed(xlim = c(-0.5, (maxRange[2]+buffer)), ylim = c(-0.5, (maxRange[2]+buffer))) + theme(aspect.ratio=1)
# One attempt to create consistent hexagon sizes and retain legend
ggplot(hexdf, aes(x=x, y=y, hexID=ID, counts=counts, fill=countColor)) + geom_hex(data=hexdf, aes(fill=countColor)) + geom_hex(stat="identity", fill=hexdf$countColor) + scale_fill_manual(labels = as.character(c(0, my_breaks)), values = rev(clrs), name = "Count") + geom_abline(intercept = 0, color = "red", size = 0.25) + labs(x = "A", y = "C") + coord_fixed(xlim = c(-0.5, (maxRange[2]+buffer)), ylim = c(-0.5, (maxRange[2]+buffer))) + theme(aspect.ratio=1)
Toutes les suggestions sur la façon de garder l'hexagone tailles cohérentes tout en conservant la légende serait très utile!
Merci pour la solution fantastique et détaillée! Oui, tu as raison. Je suis en train de changer les étiquettes de la légende pour montrer la continuité. Dans ce cas, all_break_labs sera vraiment: "0-2", "2-4", "4-6", "6-8", "8-20", "20+" –