# Choosing Styles of Various Graph Elements in R

January 2011

## R Graph Cookbook

 Detailed hands-on recipes for creating the most useful types of graphs in R – starting from the simplest versions to more advanced applications Learn to draw any type of graph or visual data representation in R Filled with practical tips and techniques for creating any type of graph you need; not just theoretical explanations All examples are accompanied with the corresponding graph images, so you know what the results look like Each recipe is independent and contains the complete explanation and code to perform the task as efficiently as possible

(For more resources on R, see here.)

# Choosing plotting point symbol styles and sizes

In this recipe, we will see how we can adjust the styling of plotting symbols, which is useful and necessary when we plot more than one set of points representing different groups of data on the same graph.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on. We will also use the cityrain.csv example data file. Please read the file into R as follows:

`rain<-read.csv("cityrain.csv")`

## How to do it...

The plotting symbol and size can be set using the pch and cex arguments:

`plot(rnorm(100),pch=19,cex=2)`

## How it works...

The pch argument stands for plotting character (symbol). It can take numerical values (usually between 0 and 25) as well as single character values. Each numerical value represents a different symbol. For example, 1 represents circles, 2 represents triangles, 3 represents plus signs, and so on. If we set the value of pch to a character such as "*" or "£" in inverted commas, then the data points are drawn as that character instead of the default circles.

The size of the plotting symbol is controlled by the cex argument, which takes numerical values starting at 0 giving the amount by which plotting symbols should be magnified relative to the default. Note that cex takes relative values (the default is 1). So, the absolute size may vary depending on the defaults of the graphic device in use. For example, the size of plotting symbols with the same cex value may be different for a graph saved as a PNG file versus a graph saved as a PDF.

## There’s more...

The most common use of pch and cex is when we don’t want to use color to distinguish between different groups of data points. This is often the case in scientific journals which do not accept color images. For example, let’s plot the city rainfall data as a set of points instead of lines:

`plot(rain\$Tokyo,ylim=c(0,250),main="Monthly Rainfall in major cities",xlab="Month of Year",ylab="Rainfall (mm)",pch=1)points(rain\$NewYork,pch=2)points(rain\$London,pch=3)points(rain\$Berlin,pch=4)legend("top",legend=c("Tokyo","New York","London","Berlin"),ncol=4,cex=0.8,bty="n",pch=1:4)`

# Choosing line styles and width

Similar to plotting point symbols, R provides simple ways to adjust the style of lines in graphs.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on. We will again use the cityrain.csv data file.

## How to do it...

Line styles can be set by using the lty and lwd arguments (for line type and width respectively) in the plot(), lines(), and par() commands. Let’s take our rainfall example and apply different line styles keeping the color the same:

`plot(rain\$Tokyo,ylim=c(0,250),main="Monthly Rainfall in major cities",xlab="Month of Year",ylab="Rainfall (mm)",type="l",lty=1,lwd=2)lines(rain\$NewYork,lty=2,lwd=2)lines(rain\$London,lty=3,lwd=2)lines(rain\$Berlin,lty=4,lwd=2)legend("top",legend=c("Tokyo","New York","London","Berlin"),ncol=4,cex=0.8,bty="n",lty=1:4,lwd=2)`

## How it works...

Both line type and width can be set with numerical values as shown in the previous example. Line type number values correspond to types of lines:

• 0: blank
• 1: solid (default)
• 2: dashed
• 3: dotted
• 4: dotdash
• 5: longdash
• 6: twodash

We can also use the character strings instead of numbers, for example, lty="dashed" instead of lty=2.

The line width argument lwd takes positive numerical values. The default value is 1. In the example we used a value of 2, thus making the lines thicker than default.

(For more resources on R, see here.)

# Choosing box styles

The styles of various boxes drawn in a graph such as the one around the plotting region and the legend can be adjusted in a similar way to the line styles we saw in the last recipe.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on.

## How to do it...

Let's say we want to make an L-shaped box around a graph, such that the default top and right borders are not drawn. We can do so using the bty argument in the par() command:

`par(bty="l")plot(rnorm(100))`

## How it works...

The bty argument stands for box type and takes single characters in inverted commas as values. The resulting box resembles the corresponding upper case letter. For example, the default value is o, thus giving a box with all four edges. Other possible values are l, 7, c, u, and ]. If we do not wish to draw a box at all, we can set bty to n.

Note that setting bty to n doesn’t suppress the drawing of axes. If we wish to suppress those too then we would also have to set xaxt and yaxt to n. Alternatively, we can simply set the axes argument to FALSE in the plot() function call.

## There's more...

Box styles can be controlled in a finer way using the box() command. In addition to the lty and lwd arguments, we can also specify where the box should be drawn using the which parameter, which can take values of plot, figure, inner, and outer.

Let's say we want to draw a graph with an L-shaped box for the plot area and a full box around the figure including the axis annotations and titles, then we can do:

`par(oma=c(1,1,1,1))plot(rnorm(100),bty="l")box(which="figure")`

Note that we had to first set the outer margins by setting the oma argument with the par() function. We will learn more about this argument later in this article. If we did not set the outer margins, the box around the figure would be right at the edge of the plot and get cut off because the default margins are set to zero.

# Adjusting axis annotations and tick marks

The default axis settings are often not adequate to deal with all kinds of data. For example, we may wish to change the number of tick marks along an axis or change the orientation of the annotations if they are too long to fit horizontally. In this recipe we will cover some settings which can be used to customize axes as per our requirements.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on.

## How to do it...

We can set the xaxp and yaxp arguments with the par() command to specify co-ordinates of the extreme tick marks and the number of intervals between tick marks in the form c(min,max,n).

`plot(rnorm(100),xaxp=c(0,100,10))`

## How it works...

When xaxp or yaxp is not specified, R automatically calculates the number of tick marks and their values. By default, R extends the axis limits by adding 4% at each end and then draws an axis which fits within the extended range. This means that even if we set the axis limits using xlim or ylim, the graph corners don’t exactly correspond with those values. To make sure they do, we need to change the axis style using the xaxs argument, which takes one of two possible values: r (regular or default) and i (internal). We need to set xaxs to i.

A vector of the form c(x1, x2, n) giving the co-ordinates of the extreme tick marks and the number of intervals between tick marks.

## There's more...

To change the orientation of axis value annotations, we need to set the las argument of the par() command. It takes one of four possible numeric values:

• 0: always parallel to the axis (default)
• 1: always horizontal
• 2: always perpendicular to the axis
• 3: always vertical

We can also use the axis() command to make a custom axis by specifying a number of arguments. The basic arguments are:

• side which takes numeric values (1=below, 2=left, 3=above and 4=right)
• at which takes a vector of co-ordinates where tick marks are to be drawn
• labels which takes a vector of tick mark annotations

We can separately set the line width for the axis lines and the tick marks by passing the lwd and lwd.ticks arguments respectively. Similarly colors can be set using the col and col.ticks arguments.

# Formatting log axes

In scientific analysis, we often need to represent data on a logarithmic scale. In this recipe, we will see how we can do this easily in R.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on.

## How to do it...

The simplest way to make an axes logarithmic is to use the log argument in the plot() command:

`plot(10^c(1:5),log="y",type="b")`

## How it works...

The log argument takes character values specifying which axes should be logarithmic: x for X axis only, y for Y axis only, and xy or yx for both axes.

## There's more...

We can also set scales to be logarithmic by setting the xlog and ylog arguments to TRUE with the par() command. This can be handy if we wish to have the same setting for multiple plots as par() applies the settings to all subsequent plots on the same device.

Note that R will not create the plot if our data contains zero or negative values.

# Setting graph margins and dimensions

In this recipe we will learn how to adjust graph margins and dimensions.

All you need to try out this recipe is to run R and type the recipe at the command prompt. You can also choose to save the recipe as a script so that you can use it again later on.

## How to do it...

We can use the fin and pin arguments of the par() command to set the figure region and plot dimensions:

`par(fin=c(6,6),pin=c(4,4))`

We can use the mai and omi arguments to adjust the inner and outer margins respectively:

`par(mai=c(1,1,1,1),omi=c(0.1,0.1,0.1,0.1))`

## How it works...

All the previous arguments accept values in inches as a pair of width and height values. The default values for fin and pin are approximately 7x7 and 5.75x5.15. We have to be careful not to specify bigger values for pin than fin or we would get an error.

Adjusting fin and pin is one way of setting the figure margins containing the axis annotations and labels. Another way is to use the mai or mar arguments. In the example, we used mai which takes a vector value in inches, whereas mar takes a vector of numerical values in terms of number of lines of margins. It is better to use mar or mai because they adjust the figure margins irrespective of the figure or plot size.

We can also set an outer margin which is set to zero by default. This margin is useful if we wish to contain the entire graph including axis labels within a box as we saw in an earlier recipe. Like figure margins, outer margins can be set in inches with omi or in number of lines of text using oma.

R Graphics by Paul Murrell is an excellent reference with visual explanations of how margins work in R.

This talk by Paul Murrell also contains figures from the book explaining the same concepts.

# Summary

This article took a look at choosing plotting point symbol styles and sizes, choosing line styles and width, and choosing box styles. We also saw how to adjust axis annotations and tick marks, how to format log axes and setting graph margins and dimensions.

Further resources on this subject:

You've been reading an excerpt of: