# [R] how to plot the histogram and the curve in the same graph

Carl Witthoft carl at witthoft.com
Tue Oct 21 23:12:08 CEST 2008

```Here is some code that more or less does what you want -- not a true
histogram, but all else is in place.
Feel free to modify, give away, etc. No copyright ;-)

myhist<-function(data,breaks="Sturges",xlabel="data
histogram",sdf=5)
{
sudh<-hist(data,plot=FALSE,breaks=breaks)

#
# Note: the literature says a histogram relates count density to box
volume, so
# technically this function makes a bar chart, not a histogram.  Whatever.
#
# get current graph dims and calculate  a nice bar width
pdim<-par('din')
barwd<-pdim*2
# find midpoints of histogram cells IDIOT: hist() does this for you
#mids<-breaks[1:(length(breaks)-1)] +diff(breaks)/2
# get max of spline-- will almost always be > data
#smoo<-spline(sudh\$breaks[1:length(sudh\$breaks)-1],sudh\$counts)
smoo<-spline(sudh\$mids,sudh\$counts)
#this was dumb: only plot smoo if curve=TRUE,
# labels and stuff  are hairy if merge a PLOT inside and outside IF
#subtle: to get same graph size, need to set ymax for plot to max of
spline(y)
# I think usr=c(min(smoo\$x),max(sudh\$breaks),0,max(smoo\$y)) works
if(curve) {
plot(smoo\$x,
smoo\$y,xlab=xlabel,ylab=ylabel,'l',col='green',usr=c(min(smoo\$x),max(sudh\$breaks),0,max(smoo\$y)))
#now plot the bars

lines (sudh\$mids,sudh\$counts,type='h',lwd=barwd,lend=1)
}
else {
#just plot the hist, not the spline
#plot(sudh\$breaks[1:length(sudh\$breaks)-1],sudh\$counts,type='h',xlab=xlabel,ylab=ylabel,lwd=barwd,lend=1)
plot(sudh\$mids,sudh\$counts,type='h',xlab=xlabel,ylab=ylabel,lwd=barwd,lend=1)
#lines(sudh\$breaks[1:length(sudh\$breaks)-1]/60,sudh\$counts,col='red')
}
title(main=title)
histstuff<-list(input=data, histogram=sudh, spline=smoo)
return(invisible(histstuff))
}

```