L'utilisation correcte de scale_fill_manual() pour créer des multi-couleur des barres de l'histogramme dans ggplot2?

J'ai une série de fichiers de données que j'aimerais explorer dans R, chacun de qui j'ai l'intention de l'utiliser pour générer une trame de données avec une colonne de la variable que je vais étiquette, pour les fins de cette question, comme foo. La gamme de foo se trouve le long de l'intervalle [0, 7000]. Dans le cadre de mon exploration des données de l'exercice, j'aimerais créer un histogramme 1D de foo, mais avec un peu d'une torsion: les valeurs de foo dans la gamme entre (1000, 7000] sont particulièrement “intéressant” pour moi, et donc j'aimerais des couleurs individuelles de codes barres de l'histogramme dans la plage de données à l'aide d'une palette de couleurs (c'est à dire, parce qu'après, finalement, j'ai l'intention de réutiliser la même palette de carte de données à partir d'autres colonnes qui j'ai temporairement omis de la trame de données afin de garder ma question de devenir inutilement plus compliqué). A l'inverse, les valeurs de foo dans la gamme [0,1000] ne sont pas aussi intéressant pour moi, cependant, je voudrais encore être en mesure de les voir dans l'histogramme, mais de couleur grise, dans les cas où il y a toutes les valeurs présentes.

Dans mon exemple de code ci-dessous, j'ai généré une artificielle exemple de bloc de données, et a tenté de tracer l'histogramme à l'aide ggplot2, en sélectionnant les couleurs de remplissage à l'aide de scale_fill_manual(). J'ai eu un multi-couleur de l'histogramme, mais il ne regarde pas comme prévu: ggplot2 semble avoir ignoré mes instructions pour l'endroit où placer les pauses entre les couleurs. Plus précisément, le problème semble être lié à des données manquantes: les intervalles qui se trouvent avoir pas de données ne semblent pas obtenir mappé sur une couleur, même si c'était mon intention qu'ils devraient être. Cela signifie aussi que la couleur gris finit par obtenir mappée sur l'intervalle (1000, 1500] au lieu de [0, 1000] comme je l'avais prévu.

Ma question: comment puis-je forcer le ggplot2 à assigner des couleurs de remplissage des codes spécifiques plages de données, même si certains intervalles sont vides et ne contiennent pas de données, et les barres de l'histogramme correspondant à ces intervalles ne sont donc pas généré?

J'ai inclus une première version de mon code ci-dessous, avec un mannequin de données, par exemple l'image de la main une version annotée de la sortie qu'elle produit.

library(ggplot2)

# Minimum and maximum values of interest (for other data sets, additional
# values that are of lesser interest may fall within the interval [0, 1000])
lolim<-1000
hilim<-7000
bwdth<-500
# Construct sample data frame
df<-data.frame(foo=c(1200, 1300, 1750, 2200, 2300, 2750, 3200, 3300, 3750,
                     4200, 4300, 4750, 6200, 6300, 6750))
# Construct a discrete factor variable which can later be mapped onto
# discrete color codes
df$colcode<-cut(df$foo, breaks=c(0, seq(lolim, hilim, bwdth)),
                include.lowest=TRUE)

# Create the breaks and color codes to be used by scale_fill_manual()
brk<-levels(df$colcode)
ncol<-length(brk)
# My expectation is that "#808080FF" (gray) will map onto the range
# [0, 1000], while a palette consisting of 12 sequential shades of the
# rainbow will be mapped onto the range (1000, 7000], in intervals of 500
colors<-c("#808080FF", rainbow(ncol-1))

# Draw the histogram
print(ggplot(df, aes(foo)) +
        geom_histogram(aes(fill=colcode), binwidth=bwdth) +
        scale_fill_manual("", breaks=brk, values=colors))

L'utilisation correcte de scale_fill_manual() pour créer des multi-couleur des barres de l'histogramme dans ggplot2?

OriginalL'auteur stachyra | 2014-03-17