20

I would like to use ggplot and faceting to construct a series of density plots grouped by a factor. Additionally, I would like to a layer another density plot on each of the facets that is not subject to the constraints imposed by the facet.

For example, the faceted plot would look like this:

require(ggplot2)
ggplot(diamonds, aes(price)) + facet_grid(.~clarity) + geom_density()

and then I would like to have the following single density plot layered on top of each of the facets:

ggplot(diamonds, aes(price)) + geom_density()

Furthermore, is ggplot with faceting the best way to do this, or is there a preferred method?

skleene
  • 389
  • 3
  • 13

1 Answers1

23

One way to achieve this would be to make new data frame diamonds2 that contains just column price and then two geom_density() calls - one which will use original diamonds and second that uses diamonds2. As in diamonds2 there will be no column clarity all values will be used in all facets.

diamonds2<-diamonds["price"]
ggplot(diamonds, aes(price)) + geom_density()+facet_grid(.~clarity) + 
     geom_density(data=diamonds2,aes(price),colour="blue")

enter image description here

UPDATE - as suggested by @BrianDiggs the same result can be achieved without making new data frame but transforming it inside the geom_density().

ggplot(diamonds, aes(price)) + geom_density()+facet_grid(.~clarity) +
     geom_density(data=transform(diamonds, clarity=NULL),aes(price),colour="blue")

Another approach would be to plot data without faceting. Add two calls to geom_density() - in one add aes(color=clarity) to have density lines in different colors for each level of clarity and leave empty second geom_density() - that will add overall black density line.

ggplot(diamonds,aes(price))+geom_density(aes(color=clarity))+geom_density()

enter image description here

Didzis Elferts
  • 95,661
  • 14
  • 264
  • 201
  • 1
    Thank you for a great answer. If I had enough reputation, I would upvote :) Cheers. – skleene Apr 05 '13 at 13:38
  • A slight variation on the first approach: you don't have to make a named `diamonds2` ahead of time. You can declare it in-line in the data argument to the second `geom_density()`: `data=transform(diamonds, clarity=NULL)` – Brian Diggs Apr 05 '13 at 15:38
  • @BrianDiggs Thanks. I also had similar idea after posted answer but decided to leave this way to show that other data don't have this column and to be more general (if there is already other data frame available). – Didzis Elferts Apr 05 '13 at 15:42