[R] Histograms on a log scale

Richard.Cotton at hsl.gov.uk Richard.Cotton at hsl.gov.uk
Mon Jul 20 12:00:04 CEST 2009


> I would like to be able to plot histograms/densities on a semi-log or 
> log-log scale.

> # Get a random log-normal distribution
> r <- rlnorm(1000)
> 
> # Get the distribution without plotting it using tighter breaks
> h <- hist(r, plot=F, breaks=c(seq(0,max(r)+1, .1)))
> 
> # Plot the distribution using log scale on both axes, and use
> # blue points
> plot(h$counts, log="xy", pch=20, col="blue",
>     main="Log-normal distribution",
>     xlab="Value", ylab="Frequency")
> 
> This is very close to what I need, but how can I have filled rectangles 
> in the plot, so that it looks more like a traditional histogram?

You can use type="h" to specify histogram-like plotting.  You probably 
also want to use a linear y-scale to make frequencies easier to compare. 
Change the last line to:

plot(h$mids, h$counts, log="x", pch=20, col="blue",
    main="Log-normal distribution",
    xlab="Value", ylab="Frequency", type="h")

Alternatively, plot a histogram of the log data, and draw your own axes:

logr <- log(r)
par(las=2)
h2 <- hist(logr, axes=FALSE, breaks=seq(min(logr)-1, max(logr)+1, .5))
Axis(side=2)
Axis(side=1, at=h2$mids, labels=format(exp(h2$mids), digits=1), lty=NULL)

Or, even better, install the ggplot2 package and try something like:

qplot(r, geom="histogram") + scale_x_continuous(trans="log10")

Regards,
Richie.

Mathematical Sciences Unit
HSL



------------------------------------------------------------------------
ATTENTION:

This message contains privileged and confidential inform...{{dropped:22}}




More information about the R-help mailing list