Scaling Images

By default, images (such as JPEG, PNG, BMP, SVG) that are placed in panels are not scaled. This section demonstrates the four different scaling options available.

Here's a multi-panel figure with four panels, to contain the images. In each case, we'll use the copy of the R logo contained in the multipanelfigure package. This is a PNG file, 800 pixels wide and 700 pixels high, with a resolution of 300 dots per inch (DPI). That gives it a native size of 2.67" by 2.33".

library(multipanelfigure)
figure <- multi_panel_figure(
  width = c(1, 5),
  height = c(1, 1, 4),
  unit = "inches")
## Warning in check_units(width, unit): Multiple grid::units detected. Casting all
## to 'unit' argument ('inches').
## Warning in check_units(height, unit): Multiple grid::units detected. Casting all
## to 'unit' argument ('inches').
r_logo <- system.file("extdata/Rlogo.png", package = "multipanelfigure")

By default, the image is not rescaled, which means that only the central part of the image is displayed.

(figure %<>% fill_panel(r_logo))
## Setting row to 1
## Setting column to 1

plot of chunk none

By setting scaling = "stretch", all the image is displayed, fitting the panel exactly, but the height-to-width ratio had been altered, distorting the image.

(figure %<>% fill_panel(r_logo, scaling = "stretch"))
## Setting row to 1
## Setting column to 2

plot of chunk stretch

Setting scaling = "fit" means that the image is shrunked or grown so that it just fits inside the panel without the height-to-width ratio being distorted.

(figure %<>% fill_panel(r_logo, scaling = "fit"))
## Setting row to 2
## Setting column to 1

plot of chunk fit

Setting scaling = "shrink", works the same way as scaling = "fit" when the image is larger than the panel.

(figure %<>% fill_panel(r_logo, scaling = "shrink", row = 3, column = 1))

plot of chunk shrink_small

If the image is smaller than the panel, scaling = "shrink" works like scaling = "none".

(figure %<>% fill_panel(r_logo, scaling = "shrink", row = 2:3, column = 2))

plot of chunk shrink_big

Clipping Plots and Images

By default, plots and images are clipped so that they don't overrun the panel that they were put in. (See, for example, Panel A in the previous plot.) To demonstrate the effect of clipping, let's use a 3 by 3 multi-panel figure, and fill all but the centre panel.

library(grid)
figure2 <- multi_panel_figure(
  width = rep.int(1.25, 3),
  height = rep.int(1.25, 3),
  unit = "inches")
## Warning in check_units(width, unit): Multiple grid::units detected. Casting all
## to 'unit' argument ('inches').
## Warning in check_units(height, unit): Multiple grid::units detected. Casting all
## to 'unit' argument ('inches').
rhino <- system.file("extdata/rhino.jpg", package = "multipanelfigure")
for(position in list(c(1, 1), c(1, 2), c(1, 3), c(2, 1), c(2, 3), c(3, 1), c(3, 2), c(3, 3)))
{
  figure2 %<>% 
    fill_panel(
      rectGrob(gp = gpar(fill = "#91A45E")), 
      row = position[1], 
      column = position[2])
}
figure2

plot of chunk figure2

When we try to display the rhino, only the central part of the image is shown, since there is no rescaling, and the panel isn't big enough.

(figure2 %>% fill_panel(rhino))
## Setting row to 2
## Setting column to 2

plot of chunk clip_on

To turn off clipping, set panel_clip = "off". This time the complete image of the rhino is displayed, overrunning the other panel regions.

(figure2 %>% fill_panel(rhino, panel_clip = "off"))
## Setting row to 2
## Setting column to 2

plot of chunk clip_off