tl;dr: You want to use curve
(with add=TRUE
) or lines
.
I disagree with par(new=TRUE)
because that will double-print tick-marks and axis labels. Eg
The output of plot(sin); par(new=T); plot( function(x) x**2 )
.
Look how messed up the vertical axis labels are! Since the ranges are different you would need to set ylim=c(lowest point between the two functions, highest point between the two functions)
, which is less easy than what I'm about to show you---and way less easy if you want to add not just two curves, but many.
What always confused me about plotting is the difference between curve
and lines
. (If you can't remember that these are the names of the two important plotting commands, just sing it.)
Here's the big difference between curve
and lines
.
curve
will plot a function, like curve(sin)
. lines
plots points with x and y values, like: lines( x=0:10, y=sin(0:10) )
.
And here's a minor difference: curve
needs to be called with add=TRUE
for what you're trying to do, while lines
already assumes you're adding to an existing plot.
Here's the result of calling plot(0:2); curve(sin)
.
Behind the scenes, check out methods(plot)
. And check body( plot.function )[[5]]
. When you call plot(sin)
R figures out that sin
is a function (not y values) and uses the plot.function
method, which ends up calling curve
. So curve
is the tool meant to handle functions.