Re: Creating a histogram from a frequency vector - correction!

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: Creating a histogram from a frequency vector - correction!

S Ellison-2
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'; [hidden email]
> 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}}

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Reply | Threaded
Open this post in threaded view
|

Re: Creating a histogram from a frequency vector - correction!

David Carlson
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 <[hidden email]> 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'; [hidden email]
> > 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}}
>
> ______________________________________________
> [hidden email] 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=
> PLEASE do read the posting guide https://urldefense.proofpoint.com/v2/url?u=http-3A__www.R-2Dproject.org_posting-2Dguide.html&d=DwIFAg&c=u6LDEWzohnDQ01ySGnxMzg&r=VAaHUElasUXjP9TzIcfIrXdkDpHnJBBZ9Q1u5LcXz9s&m=ZVbXKJ26_NjMEwyoLt414s947aHWk1Eui0kMAJ7TEC4&s=6HhBux7d56HS1UuFrtWbphPMjrwGQYdPxuSal_Mcvhw&e=
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
[hidden email] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.