R offers several ways to spatially orient multiple graphs in a single graphing space. The `layout()`

function and `mfrow`

/`mfcol`

parameter settings are adequate solutions for many tasks and allow the graphing space to be broken up into tabular or matrix-based arrangements. For more fine grained manipulation, the `fig`

and `fin`

parameter settings are available. This article illustrates the capabilities and use of `fig`

and `fin`

.

First we’ll create some simulation data to work with:

# create data

sim.data

The code above results in a matrix object with eight rows and three columns.

The `fig`

and `fin`

parameters affect the same graphing elements via different units. The fig parameter takes normalized device coordinates (NDC) and fin takes dimensions in inches of the device region. Because the `fig`

units are generally more user friendly, I will use it in the examples below; however, selecting equivalent dimensions using the `fin`

would have an identical effect. Similar to other functions that use NDC to define graphing space, `fig`

takes a four item vector wherein positions one and three define, in percentages of the device region, the starting points of the x and y axes, respectively, while positions two and four define the end points. The default `fig`

setting is `(0, 1, 0, 1)`

and uses the entire device space. The default `fig`

setting is `(0, 1, 0, 1)`

and uses the entire device space. The graph below illustrates the default settings of `fig`

.

# graph cases by first column using default fig

# settings of 0 1 0 1 (the full device width and height)

par(mar=c(2, 2, 1, 1), new = FALSE, cex.axis = .6, mgp = c(0, 0, 0))

#open plot

plot(c(0,100), c(-1,1), type = "n", ylab = "", yaxt = "n", xlab = "")

points(sim.data[,1], replicate(8, 0), pch = 19, col = 1:8, cex = 1.5)

# add center reference line

abline(0,0)

legend("bottomright", fill = c(1:8), legend = c(1:8), ncol = 4)

To make the horizontal dimensions of the graph smaller or to move the graph left or right, adjust the starting and ending x coordinates, given by the first and second positions of the `fig`

value vector. To make the vertical dimensions of the graph smaller or to move the graph up or down, adjust the staring and ending y coordinates given in the third and fourth positions as below.

# decrease horizontal span

par(fig=c(0, 1, .2, .8))

#open plot

plot(c(0,100), c(-1,1), type = "n", ylab = "", yaxt = "n", xlab = "")

points(sim.data[,1], replicate(8, 0), pch = 19, col = 1:8, cex = 1.5)

# add center reference line

abline(0,0)

legend("bottomright", fill = c(1:8), legend = c(1:8), ncol = 4)

It is possible to resize and move a single graph to any spatial orientation on the graphing device using the approach above. Additionally, you can also use this method to add multiple graphs of various sizes to a single device:

# place graph one in the bottom left

par(fig=c(0, .25, 0, .25), mar=c(2,.5,1,.5), mgp=c(0, 1, 0))

#open plot

plot(c(0,100), c(-1,1), type = "n", ylab = "", yaxt = "n", xlab = "")

points(sim.data[,1], replicate(8, 0), pch = 19, col = 1:8)

# add center reference line

abline(0,0)

# place graph two in the top right

# set graphing parameters for next plot and set new parameter to TRUE

par(fig=c(.75, 1, .75, 1), new = TRUE)

#open plot

plot(c(0,100), c(-1,1), type = "n", ylab = "", yaxt = "n", xlab = "")

points(sim.data[,2], replicate(8, 0), pch = 19, col = 1:8)

# add center reference line

abline(0,0)

# place main graph in the center

# set graphing parameters for next plot and set new parameter to TRUE

par(fig=c(.25, .75, .25, .75), new = TRUE)

#open plot

plot(c(0,100), c(-1,1), type = "n", ylab = "", yaxt = "n", xlab = "")

points(sim.data[,3], replicate(8, 0), pch = 19, col = 1:8, cex = 1.5)

# add center reference line

abline(0,0)

legend("bottomright", fill = c(1:8), legend = c(1:8), ncol = 4)

For simplicity I have mostly avoided labels and titles in these graphs; however they can be added and manipulated as they would be without the use of `fig`

or `fin`

.

**This article was one of several this blog has done on graphics and visualization; you may also be interested in:**

- Advanced formatting of axes and margins for presentation
- Automated graphing and analysis using open data API’s

**Other related topics:**

- Web Scraping when data isn’t available via an API wrapper:
- RCurl (simple)
- Rvest (CSS selector targeting)
- JSON based scraping (AJAX sites, API’s)