adding vertical median line to faceted histograms

4,578 views
Skip to first unread message

Karin Lagesen

unread,
Nov 17, 2010, 1:25:27 PM11/17/10
to ggp...@googlegroups.com
Hi!

First of all, thanks to all who work on it for a very nice package!

I am trying to add a vertical line to a set of faceted histograms
which will show the median of the values that are plotted in the
histogram.

Example:

g1 <- ggplot(diamonds,aes(x=carat))
g1 + geom_histogram() + facet_grid(cut~color)


That is, I want the median value of carat _within each facet_ to show
up as a vertical line within that panel.

TIA!

Karin

--
Karin
--
karin....@gmail.com

Brandon Hurr

unread,
Nov 17, 2010, 2:17:46 PM11/17/10
to Karin Lagesen, ggp...@googlegroups.com
Karin, 

I remember someone having a similar problem before. I don't remember there being a graceful solution, but I do vaguely remember Hadley saying that he was considering enabling this in faceting. 

This is my solution. 

ggplot(diamonds,aes(x=carat)) +

geom_histogram() +

facet_grid(cut~color)+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "D",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "E",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "F",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "G",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "H",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "I",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Fair" & diamonds$color == "J",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "D",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "E",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "F",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "G",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "H",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "I",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Good" & diamonds$color == "J",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "D",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "E",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "F",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "G",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "H",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "I",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Very Good" & diamonds$color == "J",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "D",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "E",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "F",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "G",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "H",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "I",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Premium" & diamonds$color == "J",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "D",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "E",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "F",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "G",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "H",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "I",], aes(xintercept=median(carat)), colour="red")+

geom_vline(data = diamonds[diamonds$cut == "Ideal" & diamonds$color == "J",], aes(xintercept=median(carat)), colour="red")


I just realized that you may not need the xintercept= in an aes() but it works regardless. The key is to subset the data that you give to the geom_vline() call. 


HTH, 


Brandon



--
You received this message because you are subscribed to the ggplot2 mailing list.
Please provide a reproducible example: http://gist.github.com/270442

To post: email ggp...@googlegroups.com
To unsubscribe: email ggplot2+u...@googlegroups.com
More options: http://groups.google.com/group/ggplot2

baptiste auguie

unread,
Nov 17, 2010, 2:36:11 PM11/17/10
to Karin Lagesen, ggp...@googlegroups.com
Hi,

try this,

med.fac = ddply(diamonds, .(cut, color), function(.d)
data.frame(x=median(.d$carat)))

ggplot(diamonds,aes(x=carat)) +
geom_histogram() +
facet_grid(cut~color)+ geom_vline(data=med.fac, aes(xintercept=x))

HTH,

baptiste

Brandon Hurr

unread,
Nov 17, 2010, 2:41:58 PM11/17/10
to baptiste auguie, Karin Lagesen, ggp...@googlegroups.com
That's much more succinct! 

Thanks Baptiste.

Karin Lagesen

unread,
Nov 17, 2010, 2:46:01 PM11/17/10
to ggp...@googlegroups.com
>> med.fac = ddply(diamonds, .(cut, color), function(.d)
>> data.frame(x=median(.d$carat)))
>>
>> ggplot(diamonds,aes(x=carat)) +
>> geom_histogram() +
>> facet_grid(cut~color)+ geom_vline(data=med.fac, aes(xintercept=x))

Short answer: this works!

Thankyou for an incredibly fast response!


Karin
--
karin....@gmail.com

Reply all
Reply to author
Forward
0 new messages