Generic X-Y Plotting

Generic function for plotting of R objects. For more details about the graphical parameter arguments, see par.

For simple scatter plots, plot.default will be used. However, there are plot methods for many R objects, including functions, data.frames, density objects, etc. Use methods(plot) and the documentation for these.

plot(x, y, …)

the coordinates of points in the plot. Alternatively, a single plotting structure, function or any R object with a plot method can be provided.


the y coordinates of points in the plot, optional if x is an appropriate structure.

Arguments to be passed to methods, such as graphical parameters (see par). Many methods will accept the following arguments:


what type of plot should be drawn. Possible types are

  • "p" for points,

  • "l" for lines,

  • "b" for both,

  • "c" for the lines part alone of "b",

  • "o" for both ‘overplotted’,

  • "h" for ‘histogram’ like (or ‘high-density’) vertical lines,

  • "s" for stair steps,

  • "S" for other steps, see ‘Details’ below,

  • "n" for no plotting.

All other types give a warning or an error; using, e.g., type = "punkte" being equivalent to type = "p" for S compatibility. Note that some methods, e.g.plot.factor, do not accept this.


an overall title for the plot: see title.


a sub title for the plot: see title.


a title for the x axis: see title.


a title for the y axis: see title.


the \(y/x\) aspect ratio, see plot.window.


The two step types differ in their x-y preference: Going from \((x1,y1)\) to \((x2,y2)\) with \(x1 < x2\), type = "s" moves first horizontal, then vertical, whereas type = "S" moves the other way around.

See Also

plot.default, plot.formula and other methods; points, lines, par. For thousands of points, consider using smoothScatter() instead of plot().

For X-Y-Z plotting see contour, persp and image.

  • plot
library(graphics) require(stats) # for lowess, rpois, rnorm plot(cars) lines(lowess(cars)) plot(sin, -pi, 2*pi) # see ?plot.function ## Discrete Distribution Plot: plot(table(rpois(100, 5)), type = "h", col = "red", lwd = 10, main = "rpois(100, lambda = 5)") ## Simple quantiles/ECDF, see ecdf() {library(stats)} for a better one: plot(x <- sort(rnorm(47)), type = "s", main = "plot(x, type = \"s\")") points(x, cex = .5, col = "dark red")
Documentation reproduced from package graphics, version 3.4.0, License: Part of R 3.4.0

Community examples at Jan 17, 2017 graphics v3.3.2

Pass a numeric vector to the `x` and `y` arguments, and you get a scatter plot. The `main` argument provides a [`title()`]( ```{r} plot(1:100, (1:100) ^ 2, main = "plot(1:100, (1:100) ^ 2)") ``` If you only pass a single argument, it is interpreted as the `y` argument, and the `x` argument is the sequence from 1 to the length of `y`. ```{r} plot((1:100) ^ 2, main = "plot((1:100) ^ 2)") ``` `cex` ("character expansion") controls the size of points. `lwd` controls the line width. `pch` controls the shape of points - you get 25 symbols to choose from, as well as alphabetic characters. `col` controls the color of the points. When `pch` is `21:25`, the points also get a background color which is set using `bg`. [`points()`]( for more on how to change the appearance of points in a scatter plot. ```{r} plot( 1:25, cex = 3, lwd = 3, pch = 1:25, col = rainbow(25), bg = c(rep(NA, 20), terrain.colors(5)), main = "plot(1:25, pch = 1:25, ...)" ) ``` If you specify `type = "l"`, you get a line plot instead. See [`plot.default()`]( for a demonstration of all the possible values for type. ```{r} plot( (1:100) ^ 2, type = "l", main = 'plot((1:100) ^ 2, type = "l")' ) ``` `lty` controls the line type. `col` and `lwd` work in the same way as with points. [`lines()`]( for more on how to change the appearance of lines in a line plot. ```{r} plot( (1:100) ^ 2, type = "l", lty = "dashed", lwd = 3, col = "chocolate", main = 'plot((1:100) ^ 2, type = "l", lty = "dashed", ...)' ) ``` It is best practise to keep your `x` and `y` variables together, rather than as separate variables. ```{r} with( cars, plot(speed, dist, main = "with(cars, plot(speed, dist))") ) ``` The formula interface, similar to modeling functions like [`lm()`](, makes this convenient. See [`plot.formula()`]( for more information. ```{r} plot( dist ~ speed, data = cars, main = "plot(dist ~ speed, data = cars)" ) ``` If you pass a two column data frame or matrix then the columns are treated as the x and y values. So in this case, you can simply do: ```{r} plot(cars, main = "plot(cars)") ``` The [`lines()`](, [`points()`]( and [`title()`]( functions add lines, points and titles respectively to an existing plot. ```{r} plot(cars) lines(lowess(cars)) title("plot(cars); lines(lowess(cars))") ``` If the `x` variable is categorical, `plot()` knows to draw a box plot instead of a scatter plot. See [`boxplot()`]( for more information on drawing those. ```{r} with( sleep, plot(group, extra, main = "with(sleep, plot(group, extra))") ) ``` Again, the formula interface can be useful here. ```{r} plot(extra ~ group, sleep, main = "plot(extra ~ group, sleep)") ``` Axis limits can be set using `xlim` and `ylim`. ```{r} plot( (1:100) ^ 2, xlim = c(-100, 200), ylim = c(2500, 7500), main = "plot((1:100) ^ 2, xlim = c(-100, 200), ylim = c(2500, 7500))" ) ``` You can set log-scale axes using the `log` argument. ```{r} plot( exp(1:10), 2 ^ (1:10), main = "plot(exp(1:10), 2 ^ (1:10))" ) plot( exp(1:10), 2 ^ (1:10), log = "x", main = 'plot(exp(1:10), 2 ^ (1:10), log = "x")' ) plot( exp(1:10), 2 ^ (1:10), log = "y", main = 'plot(exp(1:10), 2 ^ (1:10), log = "y")' ) plot( exp(1:10), 2 ^ (1:10), log = "xy", main = 'plot(exp(1:10), 2 ^ (1:10), log = "xy")' ) ``` If you pass a table of counts for a vector, `plot()` draws a simple histogram-like plot. See [`hist()`]( for a more comprehensive histogram function. ```{r} plot( table(rpois(100, 5)), main = "plot(table(rpois(100, 5)))" ) ``` For multi-dimensional tables, you get a mosaic plot. See [`mosaicplot()`]( for more information. ```{r} plot( table(X = rpois(100, 5), Y = rbinom(100, 10, 0.75)), main = "plot(table(X = rpois(100, 5), Y = rbinom(100, 10, 0.75)))" ) ``` You can also pass functions to plot. See [`curve()`]( for more examples. ```{r} plot( sin, from = -pi, to = 2 * pi, main = "plot(sin, from = -pi, to = 2 * pi)" ) ``` Use the axis function to give fine control over how the axes are created. See [`axis()`]( and [`Axis()`]( for more info. ```{r} plot( sin, from = -pi, to = 2 * pi, axes = FALSE, main = "plot(sin, axes = FALSE, ...); axis(1, ...); axis(2)" ) axis( 1, # bottom axis pi * (-1:2), c(expression(-pi), 0, expression(pi), expression(2 * pi)) ) axis(2) # left axis ``` Further graphical parameters can be set using [`par()`]( See [`with_par()`]( for the best way to use `par()`. ```{r} old_pars <- par(las = 1) # horizontal axis labels plot((1:100) ^ 2, main = "par(las = 1); plot((1:100) ^ 2)") par(old_pars) # reset parameters ```