Provides a simple way to generate plots of pdfs, probability mass functions, cdfs, probability histograms, and normal-quantile plots for distributions known to R.

  xlim = NULL,
  ylim = NULL,
  under = FALSE,
  packets = NULL,
  rows = NULL,
  columns = NULL,
  kind = c("density", "cdf", "qq", "histogram"),
  xlab = "",
  ylab = "",
  breaks = NULL,
  resolution = 5000L,
  params = NULL



A string identifying the distribution. This should work with any distribution that has associated functions beginning with 'd', 'p', and 'q' (e.g, dnorm(), pnorm(), and qnorm()). dist should match the name of the distribution with the initial 'd', 'p', or 'q' removed.


other arguments passed along to lattice graphing routines


a numeric vector of length 2 or NULL, in which case the central 99.8 of the distribution is used.


a numeric vector of length 2 or NULL, in which case a heuristic is used to avoid chasing asymptotes in distributions like the F distributions with 1 numerator degree of freedom.


a logical indicating whether the plot should be added to the previous lattice plot. If missing, it will be set to match under.


a logical indicating whether adding should be done in a layer under or over the existing layers when add = TRUE.

packets, rows, columns

specification of which panels will be added to when add is TRUE. See latticeExtra::layer().


one of "density", "cdf", "qq", or "histogram" (or prefix of any of these)

xlab, ylab

as per other lattice functions


a vector of break points for bins of histograms, as in histogram()


passed along to various lattice graphing functions


number of points to sample when generating the plots


a list containing parameters for the distribution. If NULL (the default), this list is created from elements of \dots that are either unnamed or have names among the formals of the appropriate distribution function. See the examples.


plotDist() determines whether the distribution is continuous or discrete by seeing if all the sampled quantiles are unique. A discrete random variable with many possible values could fool this algorithm and be considered continuous.

The plots are done referencing a data frame with variables x and y giving points on the graph of the pdf, pmf, or cdf for the distribution. This can be useful in conjunction with the groups argument. See the examples.



plotDist('norm', type='h')

plotDist('norm', kind='cdf')

plotDist('exp',  kind='histogram')

plotDist('binom', params=list( 25, .25))       # explicit params

plotDist('binom', 25, .25)                     # params inferred

plotDist('norm', mean=100, sd=10, kind='cdf')  # params inferred

plotDist('binom', 25, .25, xlim=c(-1,26) )     # params inferred

plotDist('binom', params=list( 25, .25), kind='cdf')

plotDist('beta', params=list( 3, 10), kind='density')

plotDist('beta', params=list( 3, 10), kind='cdf')

plotDist( "binom", params=list(35,.25), 
           groups= y < dbinom(qbinom(0.05, 35, .25), 35,.25) )

plotDist( "binom", params=list(35,.25), 
           groups= y < dbinom(qbinom(0.05, 35, .25), 35,.25), 

plotDist("norm", mean=10, sd=2, col="blue", type="h")

plotDist("norm", mean=12, sd=2, col="red", type="h", under=TRUE)

plotDist("binom", size=100, prob=.30) +
  plotDist("norm", mean=30, sd=sqrt(100 * .3 * .7))

plotDist("chisq", df=4, groups = x > 6, type="h")

plotDist("f", df1=1, df2 = 99)

if (require(mosaicData)) {
histogram( ~age|sex, data=HELPrct)
m <- mean( ~age|sex, data=HELPrct)
s <- sd(~age|sex, data=HELPrct)
plotDist( "norm", mean=m[1], sd=s[1], col="red", add=TRUE, packets=1)
plotDist( "norm", mean=m[2], sd=s[2], col="blue", under=TRUE, packets=2)