I've got two overlapping density functions I created as follows:
require(ggplot2)
set.seed(2)
a =rnorm(100)
b = rnorm(100,.5,1.2)
c = rnorm(100,.3,1.2)
data <- rbind( data.frame(type="a", lr=a), data.frame(type="b", lr=b))
data2 <- rbind( data.frame(type="b", lr=b), data.frame(type="c", lr=c))
m <- ggplot(data, aes(x=lr))
m <- m + geom_density(aes(fill=factor(type)), size=2, alpha=.4)
m2 <- ggplot(data2, aes(x=lr))
m2 <- m2 + geom_density(aes(fill=factor(type)), size=2, alpha=.4)
which produces these two nice plots:
m
m2
My problem is that ggplot alphabetically decides the red and blue colours and as you see in first one "b" is blue but in the second one "b" is red. I don't know how to force the "b" to be red. How can I select the colours for each of them?
It sounds like you want both density plots to be red. In that case, you can use group
instead of fill
within aes
to indicate the grouping variable, and then set the fill
color for the whole graph, as follows:
m <- m + geom_density(aes(
group=factor(type)), fill="#ff0000"
, size=2, alpha=.4)
But if you're actually trying to set specific colors for each group, then you can use scale_fill_manual
. There are two ways to do this: either with a named vector of colors, or with two vectors--one with colors, and one with group names. Here it is from the docs:
values
a set of aesthetic values to map data values to. If this is a named vector, then the values will be matched based on the names. If unnamed, values will be matched in order (usually alphabetical) with the limits of the scale. Any data values that don't match will be givenna.value
.
groupColors <- c(a="#00ff00", b="#ff0000", c="#0000ff")
m <- ggplot(data, aes(x=lr))
m <- m + geom_density(aes(fill=factor(type)), size=2, alpha=.4) +
scale_fill_manual(values=groupColors)
m2 <- ggplot(data2, aes(x=lr))
m2 <- m2 + geom_density(aes(fill=factor(type)), size=2, alpha=.4) +
scale_fill_manual(values=groupColors)
groupLimits <- c("a", "b", "c")
groupColors <- c("#00ff00", "#ff0000", "#0000ff")
m <- ggplot(data, aes(x=lr))
m <- m + geom_density(aes(fill=factor(type)), size=2, alpha=.4) +
scale_fill_manual(values=groupColors, limits=groupLimits)
m2 <- ggplot(data2, aes(x=lr))
m2 <- m2 + geom_density(aes(fill=factor(type)), size=2, alpha=.4) +
scale_fill_manual(values=groupColors, limits=groupLimits)
One key difference in this approach is that groupLimits
will control the order in which the different groups appear in the legend (and, in this case, will also force all three groups to appear).