# 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)
##   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'.

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