tags:

views:

165

answers:

2

I have generated the following plot using the R code that follows it: alt text

ggplot(lengths, aes(length, fill = library)) + geom_density(alpha = 0.2) + coord_cartesian(xlim = c(0, 60000)) 

Now I would like to make the plot a bit prettier:

  1. Make the x-axis show length every 5000 units (instead of every 20000)
  2. Add x-values on top of the three peaks (approx 3000,5000 and 35000).

How can I do that?

update in response to James: alt text

+3  A: 

1: + scale_x_continuous(breaks=rep(5000,12)).

You could also put the xlim declaration in here, using limits, eg,

+ scale_x_continuous(breaks=rep(5000,12),limits=c(0,60000))

2: For the labels you could use annotate() or geom_text(). See this post for examples. You would have to calculate the values yourself for this though.

James
adding the xlim declaration does not seem to work well. see original post to see what I get.
David B
Sorry, it uses `limits` rather than `xlim` here, edited original post to explain better.
James
+3  A: 

How about:

(first create a reproducible example)

set.seed(1001)
lengths <- data.frame(length=c(rgamma(1000,shape=10,scale=500),
                    10000+rgamma(1000,shape=5,scale=700),
                    rnorm(500,mean=30000,sd=2000)),
                  library=factor(rep(2:1,c(2000,500))))

(cute stuff to find peak locations and heights)

peakfun <- function(x) {
  d <- density(x$length)
  peaks <- which(diff(sign(diff(d$y)))==-2)
  data.frame(x=d$x[peaks],y=d$y[peaks])
}

peakdat <- ddply(lengths,.(library),peakfun)
peakdat <- peakdat[-1,] ## drop spurious peak

(draw the plot)

library(ggplot2)
ggplot(lengths, aes(length, fill = library)) +
  geom_density(alpha = 0.2) +
  scale_x_continuous(limits = c(0,60000),
                     breaks = seq(0,60000,by=5000))+
  geom_text(data=peakdat,aes(x=x,y=y,label=round(x)),vjust=1)

you probably want to tweak the vertical height of the labels a little

Ben Bolker
+1 I'd give +10 if I could... :). Thanks!
David B