# Graphics¶

With R you can make beautiful plots. You have a lot of control over what you want your plots to look like. But all the control is via code, and this does make things pretty complicated at times.

Moreover, there are entirely different approaches to make plots. Here we only discuss scatter-plots with the “base” package. The next chapter shows other basic plot types. The chapter thereafter shows how you can make plots with additional packages `levelplot` and `ggplot`. It is very useful to learn about “base” plotting first before you get into the more complicated (and sometimes, but not always more fancy) approaches. There are many websites with cool examples.

Here we use the `cars`, `InsectSprays` and `iris` data sets that come with R.

`cars` has two variables: the speed of cars and the distances taken to stop (data recorded in the 1920s), see `?cars`

## Scatter plots¶

```data(cars)
head(cars)
##   speed dist
## 1     4    2
## 2     4   10
## 3     7    4
## 4     7   22
## 5     8   16
## 6     9   10
```

As we only have two variables, we can simply do

```plot(cars)
``` But to be more explicit:

```plot(cars[,1], cars[,2])
``` And now to embellish, add axes labels.

```plot(cars[,1], cars[,2], xlab='Speed of car (miles/hr)', ylab='Stopping distance (feet)')
``` Different symbols (`pch` is the symbol type, `cex` is the size).

```plot(cars, xlab='Speed of car (miles/hr)', ylab='Stopping distances (feet)', pch=20, cex=2, col='red')
``` `cex` is the magnification factor. The default value is 1.

Let’s change some things about the axes. Use `xlim` and `ylim` to set the start and end of an axis. `las=1` changes the orientation of the y-axis labels to horizontal.

```plot(cars, xlab='Speed', ylab='Time', pch=20, cex=2, col='red', xlim = c(0,25), las=1)
``` Here we do not draw axes at first, and then add the lower (1) and left (2) axis, to avoid drawing the clutter from the unnecessary “upper” and “right” axis. Arguments `xaxs="i"` and `yaxs="i"` force the axis to touch at `(0,0)`.

```plot(cars, xlab='Speed', ylab='', pch=20, cex=2, col='red', xlim = c(0,27), ylim=c(0,125), axes=FALSE, xaxs="i", yaxs="i")
axis(1)
axis(2, las=1)
text(5, 100, 'Cars!', cex=2, col='blue')
par(xpd=NA)
text(-1, 133, 'Distance\n(feet)')
``` We can change the symbols using another variable. Let’s say we have three car brands and that we want to vary the symbol type, color, and size by brand (typically one of these changes should suffice to distinguish them!).

```set.seed(0)
brands <- c('Buick', 'Chevrolet', 'Ford')
b <- sample(brands, nrow(cars), replace=TRUE)
i <- match(b, brands)
plot(cars, pch=i+1, cex=i, col=rainbow(3)[i])
j <- 1:length(brands)
legend(5, 120, brands, pch=(j+1), pt.cex=j, col=rainbow(3), cex=1.5)
``` The important step is the use of `match`, that creates for each character string a matching number that can be used to set the character type desired.

As you have seen above, `plot` takes many variables. Several other parameters influencing your plot, can be set with `par`. See `?par` for details. Here I use it to create 4 subplots (`mfrow=c(2,2)` with non-default margins (`mar=c(2,3,1.5,1.5)`).

```par(mfrow=c(2,2), mar=c(2,3,1.5,1.5))
for (i in 1:4) {
plot(sample(cars[,1]), sample(cars[,2]), xlab='', ylab='', las=1)
}
``` ## Some other base plots¶

Now consider the `InsectSprays` dataset

```head(InsectSprays)
##   count spray
## 1    10     A
## 2     7     A
## 3    20     A
## 4    14     A
## 5    14     A
## 6    12     A
```
```hist(InsectSprays[,1])
``` ```x <- aggregate(InsectSprays[,1,drop=F], InsectSprays[,2,drop=F], sum)
barplot(x[,2], names=x[,1], horiz=T, las=1)
``` ```boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
``` ## Exploring the iris data set¶

Now let’s have a look at the ‘iris’ dataset. It has 150 observations of 5 variables for 3 species of iris.

```data(iris)
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  \$ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  \$ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  \$ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  \$ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  \$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
```

Default plot characteristics are not satisfactory most of the time. You may want different heading, labels of x and y axis or different color of lines/points/bars. There is a large number of graphical parameters to set these. Here are some examples.

### Scatter plot¶

Note how the scatter plot type is controlled by `type` parameter.

```plot(iris\$Sepal.Length, type = 'l')
``` ```plot(iris\$Sepal.Length, type = 'p')
``` ```plot(iris\$Sepal.Length, type = 'o')
``` ```plot(iris\$Sepal.Length, iris\$Sepal.Width, type = 'p')
``` ### Titles and axis labels¶

```plot(iris\$Petal.Length, iris\$Petal.Width, main = "Edgar Anderson's Iris Data",
xlab = "Petal Length", ylab = "Petal Width")
``` The font size can be changed by `cex.main` and `cex.lab` argument. Try setting `cex.lab = 2` to increase the font size of the axes. `cex.axis` controls the size of axis tick values.

### Plotting characters¶

You can use `lty` to change the line type, and `pch` to choose a point type.

```plot(iris\$Sepal.Length, type = 'l', lty = 2, lwd = 2,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width")
``` ```plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width")
``` There are many choices for `pch`. You can use `example("pch")`, or do `plot(1:25, pch=1:25)` to see the some plotting characters. Instead of a code, you can also specify the character like in `pch="&"`.

The size of a point character (pch) can be controlled with `cex` argument.

### Colors¶

```plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = 'red',
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width")
``` We can link a color to a value.

```mycolor <- c("red","green3","blue")[as.factor(iris\$Species)]
plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width")
``` Note that the length of `col` vector should be equal to the number of items you are plotting.

You can use `colors()` to see a list of named colors.

### Axes¶

To change the range of an axis you can use `xlim` and/or `ylim` argument(s).

```plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width",
xlim = c(0,10), ylim= c(0,10))
``` You can also set `xlim` and `ylim` with `range`. Try `xlim = range(iris\$Petal.Length)`.

Use `axis` function to change the tick position and annotations (axes labels). First you need to turn off the default axes.

```plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width",
xlim = c(0,10), ylim= c(0,10), axes = FALSE)
axis(1, at = 1:10, lab = c(1:10))
axis(2, at = 1:10, lab = c(1:10))
``` ### Interacting with plots¶

You can use `identify()` to identify a particular point in the plot. Try `identify(iris\$Petal.Length, iris\$Petal.Width)`. You can left click with the mouse to identify multiple points. Once complete use `ESC` to end the process.

You can use `locator()` to find out the coordinates at a particular position on a graph. Try `locator()` . You can left click with the mouse any number of times within the axes and use `ESC` to end the process. A list of X and Y coordinates of the positions clicked will be returned. You can retain this information by assigning a variable to locator before starting it: `loc <- locator()`. The coordinates will be stored as `loc\$x` and `loc\$y`. `locator` is particularly useful to add additional information to the graph. See the following example.

### Legend¶

We use a different color to represent each species of iris. We can create a legend for this information using `legend` function.

```plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width",
xlim = c(0,10), ylim= c(0,10))
legend('topright', legend = unique(iris\$Species), col = c("red","green3","blue"), pch = 8)
``` To make a legend with no border use `bty = 'n'`.

###Add text

Often we want include additional text in the plot. `locator` can be used to find the approximate x and y coordinates where you want to place the text. Use `loc <- locator()`.

```loc <- list()
loc\$x <- 2.75
loc\$y <- 4.94
plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Edgar Anderson's Iris Data", xlab = "Petal Length", ylab = "Petal Width",
xlim = c(0,10), ylim= c(0,10))
legend('topright', legend = unique(iris\$Species), col = c("red","green3","blue"),
pch = 8, bty = 'n')
text(loc\$x, loc\$y, labels = "Hello! this is a Scatter Plot")
``` ## Multiple plots¶

To combine multiple plots in one image you can use `layout()` or `par()`. For example, 4 plots can be combined with `layout(matrix(1:4, 2, 2))` or `par(mfrow=c(2,2))`.

```par(mfrow=c(2,2))
boxplot(iris\$Sepal.Length~iris\$Species, main = "Boxplot of Sepal Length",
xlab = "Species", ylab = "Sepal Length", col = c("red","green3","blue"),
cex.lab = 1.25)
hist(iris\$Sepal.Length, main = "Histogram of Sepal Length",
xlab = "Sepal Length", ylab = "Frequency", col = c("grey"), cex.lab = 1.25)
plot(iris\$Sepal.Length, type = 'l', lty = 2, lwd = 2, col = 'red',
main = "Variation with of Petal Width and Petal Length",
xlab = "Petal Length", ylab = "Petal Width", cex.lab = 1.25)
plot(iris\$Petal.Length, iris\$Petal.Width, pch = 8, col = mycolor,
main = "Scatter plot of Petal Width and Petal Length",
xlab = "Petal Length", ylab = "Petal Width", cex.lab = 1.25)
``` ## Saving plots¶

You can directly write a plot to a file such as `pdf` of `png`. To save any of the above plots in a pdf file called `theplot.pdf` you first open the `pdf device`, then do the plotting and use `dev.off()` when done.

```pdf("theplot.pdf")
boxplot(iris\$Sepal.Length~Species, main = "Boxplot of Sepal Length",
xlab = "Species", ylab = "Sepal Length", col = c("red","green3","blue"))
dev.off()
```

For plotting to an image file, you can use `png` and other formats. To set the device size (dimensions and resolution), you can use a few parameters

```png(filename = "myplot.png", width = 200, height = 300, units = "cm", res = 300)
boxplot(iris\$Sepal.Length~iris\$Species, main = "Boxplot of Sepal Length",
xlab = "Species", ylab = "Sepal Length", col = c("red","green3","blue"))
dev.off()
```

You should now have a file called “myplot.png” in your working directory.

## Summary¶

Some different plot types

```+ `plot( )`                Scatter plot, and general plotting
+ `hist( )`                Histogram
+ `stem( )`                Stem-and-leaf
+ `boxplot( )`             Boxplot
+ `qqnorm( )`              Normal probability plot
+ `mosaicplot( )`          Mosaic plot
```

Add elements to a plot

```+ `points( )`              Add points
+ `lines( )`               Add lines
+ `text( )`                Add text
+ `abline( )`              Add lines
+ `legend( )`              Add legend
```

Important graphical parameters

```+ `par( )`                 Set parameters for plotting
+ `cex`                    Font size
+ `col`                    Color of plotting symbols
+ `lty`                    Line type
+ `lwd`                    Line width
+ `mar`                    Inner margins
+ `mfrow`                  Multiple figures per image
+ `oma`                    Outer margins
+ `pch`                    Plotting symbol
+ `xlim`                   Min and max of X axis range
+ `ylim`                   Min and max of Y axis range
```

### Resources¶

Additional resources you may want to consult are the R demo for different types of plots: `demo("graphics")` and the help for plot (`?plot`).

There is also a comprehensive gallery of plots