# [R] Creating a histogram from a frequency vector - correction!

David Carlson dc@r|@on @end|ng |rom t@mu@edu
Wed Oct 9 22:49:42 CEST 2019

```Does it have to be a histogram or does it just have to look like one?

counts <- c(73,53,42,67,41,50)
vals <- c(1,2,3,4,5,6)
barplot(counts~vals, space=0)

If you want a more histogram-like axis:

barplot(counts~vals, space=0, names.arg="")
axis(1, 1:6 - .5, 1:6)

David L Carlson
Anthropology Department
Texas A&M University
College Station, TX 77843

On Wed, Oct 9, 2019 at 11:32 AM Stephen Ellison <S.Ellison using lgcgroup.com> wrote:
>
> Sorry; that was not the working version.
>
> Should be
>
> freqs <- c(11, 19,  5,  3,  2,  1,  0,  0,  2,  3,  2)
>
> freqhist <- function(counts, xname=deparse(substitute(counts)), breaks=0:length(counts),
>         mids=(breaks[-1]+breaks[-length(breaks)])/2 , ...){
>
>         binwidths <- diff(breaks)
>         dens <- counts/(binwidths*sum(counts))
>
>         retval <- structure(list(breaks=breaks, counts=counts, density=dens,
>                             mids=mids, xname=xname,
>                             equidist=all(diff(breaks)==diff(breaks[1:2]) ) ),
>                 class="histogram")
> }
>
> plot(freqhist(freqs, breaks=c(4*0:5, 10*3:5, 70, 100, 140)) )
>
> #Also works equidistant with default 0:length(counts) breaks:
>
> f2 <- c(30, 39, 31, 29, 10,  6,  3,  1,  0,  1)
> plot(freqhist(f2))
>
> Steve E
>
>
> > -----Original Message-----
> > From: Stephen Ellison
> > Sent: 09 October 2019 17:29
> > To: 'Nick Wray'; r-help using r-project.org
> > Subject: RE: [R] Creating a histogram from a frequency vector
> >
> > > I have a vector like say 73,53,42,67,41,50 where these numbers are the
> > > number of occurrences of the data values 1,2,3,4,5,6 - so in essence I have
> > > the frequency bit from the hist() function.  I can't see an elegant way
> > (there
> > > are clearly messy workarounds like generating a vector of 73 1's, 53 2's etc)
> > of
> > > creating a histogram from this data set.  Is there one?
> >
> > hist() generates a histogram object that it then plots.
> >
> > You can use your frequency vector to generate the same kind of object and
> > then just plot it, though you'll have to provide breaks (possibly defaulted, if
> > they're just 0:length(frequencies) ) and you'd have to work on the density
> > component a bit.
> >
> > I'm sure this is out there somewhere already, but here's as an example, using
> > values pulled from a (nonequidistant) ?hist example and using a short off-
> > the-cuff function to build the histogram object:
> >
> > freqs <- c(11, 19,  5,  3,  2,  1,  0,  0,  2,  3,  2) #islands
> > brks <- c(4*0:5, 10*3:5, 70, 100, 140)
> >
> > freqhist <- function(counts, xname=deparse(substitute(frequencies)),
> > breaks=0:length(frequencies),
> >       mids=(breaks[-1]+breaks[-length(breaks)])/2 , ...){
> >
> >       binwidths <- diff(breaks) #This copes with unequal break intervals
> >       dens <- counts/(binwidths*sum(counts))
> >
> >       retval <- structure(list(breaks=breaks, counts=counts,, density=dens,
> > mids=mids, xname=xname, equidist=all(diff(breaks)==diff(breaks[1:2]) ),
> >               class="histogram")
> > }
> >
> > plot(freqhist(freqs, breaks=brks))
> >
> > #Also works equidistant with default 0:length(counts) breaks:
> >
> > f2 <- c(30, 39, 31, 29, 10,  6,  3,  1,  0,  1)
> > plot(freqhist(f2))
> >
> > Steve Ellison
> >
> >
>
>
>
> *******************************************************************
> This email and any attachments are confidential. Any use...{{dropped:8}}
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Dhelp&d=DwIFAg&c=u6LDEWzohnDQ01ySGnxMzg&r=VAaHUElasUXjP9TzIcfIrXdkDpHnJBBZ9Q1u5LcXz9s&m=ZVbXKJ26_NjMEwyoLt414s947aHWk1Eui0kMAJ7TEC4&s=Kl_9bErQCYPBSlnEusw5vugVXiykEewhBBHPZ99OIAk&e=