How to better plot and compare overlapping histograms? I want to compare the distribution of 3 different time spans:

So I plot the histograms together, along with the model curve.
But I'm afraid that overlapping histograms makes each hard to see. The histogram are also set to half-transparent so the overlapping could be seen. But it also makes the color overlap, making it hard to discern one from another.
An additional problem is that, I also want to compare the bootstrapped result of the histogram, so I re-sample and plot for a lot of times:

I believe this is also very hard to see.
I'm wondering, what would be a good way for plotting this comparison? What can I do to make the plot more discernible?
 A: The usua alternatives to display "overlapping" histograms are to:


*

*place the bar side by side (but I don't think that it is working well visually in most of the situations):





*

*connect the heights of the bars with a line (and drop the bar itself - there exists alternatives where the outline of the histogram is plotted, like a skyline):



I am adding R code used to make the figures:
dataf <- bind_rows(lapply(1:10, 
                          function(x) {
                              data.frame(grp=x,
                                         value=rnorm(100,
                                                     mean=runif(1)))
                          }))

ggplot(dataf) + 
  geom_histogram(aes(x=value, fill=factor(grp)),
                 position="dodge", binwidth=.5)

ggplot(dataf) + 
  geom_freqpoly(aes(x=value, color=factor(grp)), binwidth=.5)

A: Plotting histograms together can be fine, but it breaks down when you have more than two histograms, or the more they overlap, both of which apply in your case.  I would suggest you start by making a plot matrix (so long as you don't have so many groups the plots become unusable).  
Likewise, plots with too many, and too different, objects can become difficult to interpret.  You want to compare histograms, and you want to compare kernel density plots.  Note that a plot matrix has a main diagonal for each group, and then the upper and lower triangles are symmetrical.  For a given plot in the upper triangle that compares two groups, there is a corresponding plot in the lower triangle that compares the same two groups.  Thus, I would suggest you compare histograms in the upper triangle plots, and kernel density plots in the lower triangle plots.  
Because it might still be difficult to compare two overlapping histograms in the subplots, I would suggest you make back to back histograms instead of overlapping histograms.  
Putting these suggestions together, you could get something like this:  

This was coded using R.  The double histogram code was adapted from here.  I suspect the code won't be interpretable to people who aren't already very familiar with R, but for those who do want to see it, it is displayed below:  
data(mtcars)
d  = mtcars[,c("qsec","cyl")]
ud = unstack(d)
ud = data.frame(four  = c(ud[[1]], rep(NA,3)),
                six   = c(ud[[2]], rep(NA,7)),
                eight =   ud[[3]]             )

upper = function(x, y){
  usr = par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1), new=TRUE)
  hx        = hist(x, plot=FALSE)
  hy        = hist(y, plot=FALSE)
  lim       = ifelse(max(hy$counts)>max(hx$counts), max(hy$counts), max(hx$counts))
  hy$counts = - hy$counts
  plot(hy, ylim=c(-lim, lim), col="red", xlim=c(14,23), axes=FALSE, main="")
  lines(hx, col="blue")
  abline(h=0)
}
diag.hist = function(x, ...){
  usr = par("usr"); on.exit(par(usr)); par(usr=c(usr[1:2], 0, 1.5), new=TRUE)
  hist(x, freq=FALSE, xlim=c(14,23), ylim=c(0,.8), main="", axes=FALSE)
  lines(density(na.omit(x)))
}
lower = function(x, y){
  usr = par("usr"); on.exit(par(usr)); par(usr = c(0, 1, 0, 1), new=TRUE)
  plot( density(na.omit(x)), xlim=c(14,23),ylim=c(0,.5),main="",axes=FALSE, col="blue")
  lines(density(na.omit(y)), col="red")
}

windows()
  pairs(ud, upper.panel=upper, diag.panel=diag.hist, lower.panel=lower)

