% File src/library/grid/man/grid.function.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2007 R Core Team
% Distributed under GPL 2 or later

\name{grid.function}
\alias{grid.function}
\alias{functionGrob}
\alias{grid.abline}
\title{Draw a curve representing a function}
\description{
  Draw a curve representing a function.
}
\usage{
grid.function(...)
functionGrob(f, n = 101, range = "x", units = "native",
             name = NULL, gp=gpar(), vp = NULL)

grid.abline(intercept, slope, ...)
}
\arguments{
  \item{f}{ A function that must take a single argument
    and return a list with two numeric components named \code{x} and
    \code{y}.}
  \item{n}{ The number values that will be generated as input
    to the function \code{f}.}
  \item{range}{ Either \code{"x"}, \code{"y"}, or a numeric vector.
    See the \sQuote{Details} section.}
  \item{units}{A string indicating the units to use
    for the \code{x} and \code{y} values generated by the function.}
  \item{intercept}{ Numeric.}
  \item{slope}{ Numeric. }
  \item{\dots}{ Arguments passed to \code{grid.function()}}
  \item{name}{ A character identifier. }
  \item{gp}{An object of class \code{gpar}, typically the output
    from a call to the function \code{gpar}.  This is basically
    a list of graphical parameter settings.}
  \item{vp}{A Grid viewport object (or NULL).}
}
\details{
  \code{n} values are generated and passed to the function \code{f}
  and a series of lines are
  drawn through the resulting \code{x} and \code{y} values.

  The generation of the \code{n} values depends on the value of
  \code{range}.  In the default case, \code{dim} is
  \code{"x"}, which means that a set
  of \code{x} values are generated covering the range of the current
  viewport scale in the x-dimension.  If \code{dim} is \code{"y"}
  then values are generated from the current y-scale instead.
  If \code{range} is a numeric vector, then values are generated
  from that range.

  \code{grid.abline()} provides a simple front-end for a straight
  line parameterized by \code{intercept} and \code{slope}.
}
\value{
  A functiongrob grob.
}
\author{Paul Murrell}
\seealso{
  \link{Grid},
  \code{\link{viewport}}
}
\examples{
    # abline
    # NOTE: in ROOT viewport on screen, (0, 0) at top-left
    #       and "native" is pixels!
    grid.function(function(x) list(x=x, y=0 + 1*x))
    # a more "normal" viewport with default normalized "native" coords
    grid.newpage()
    pushViewport(viewport())
    grid.function(function(x) list(x=x, y=0 + 1*x))
    # slightly simpler
    grid.newpage()
    pushViewport(viewport())
    grid.abline()
    # sine curve
    grid.newpage()
    pushViewport(viewport(xscale=c(0, 2*pi), yscale=c(-1, 1)))
    grid.function(function(x) list(x=x, y=sin(x)))
    # constrained sine curve
    grid.newpage()
    pushViewport(viewport(xscale=c(0, 2*pi), yscale=c(-1, 1)))
    grid.function(function(x) list(x=x, y=sin(x)),
                  range=0:1)
    # inverse sine curve
    grid.newpage()
    pushViewport(viewport(xscale=c(-1, 1), yscale=c(0, 2*pi)))
    grid.function(function(y) list(x=sin(y), y=y),
                  range="y")
    # parametric function
    grid.newpage()
    pushViewport(viewport(xscale=c(-1, 1), yscale=c(-1, 1)))
    grid.function(function(t) list(x=cos(t), y=sin(t)),
                  range=c(0, 9*pi/5))
    # physical abline
    grid.newpage()
    grid.function(function(x) list(x=x, y=0 + 1*x),
                  units="in")
}
\keyword{dplot}
