Skip to contents

The ggplot object, when stored, can only specify the height and width of the entire plot, not the panel. The latter is obviously more important to control the final result of a plot. This function can set the panel width/height of plot to a fixed value and rasterize it.

Usage

panel_fix(
  x = NULL,
  panel_index = NULL,
  respect = NULL,
  width = NULL,
  height = NULL,
  margin = 1,
  padding = 0,
  units = "in",
  raster = FALSE,
  dpi = 300,
  BPPARAM = BiocParallel::SerialParam(),
  return_grob = FALSE,
  bg_color = "white",
  save = NULL,
  verbose = FALSE,
  ...
)

panel_fix_overall(
  x,
  panel_index = NULL,
  respect = NULL,
  width = NULL,
  height = NULL,
  margin = 1,
  units = "in",
  raster = FALSE,
  dpi = 300,
  BPPARAM = BiocParallel::SerialParam(),
  return_grob = FALSE,
  bg_color = "white",
  save = NULL,
  verbose = TRUE
)

Arguments

x

A ggplot object, a grob object, or a combined plot made by patchwork or cowplot package.

panel_index

Specify the panel to be fixed. If NULL, will fix all panels.

respect

If a logical, this indicates whether row heights and column widths should respect each other.

width

The desired width of the fixed panels.

height

The desired height of the fixed panels.

margin

The margin to add around each panel, in inches. The default is 1 inch.

padding

The padding to add around each panel, in inches. The default is 0 inches.

units

The units in which height, width and margin are given. Can be mm, cm, in, etc. See grid::unit.

raster

Whether to rasterize the panel.

dpi

Plot resolution.

BPPARAM

An BiocParallel::BiocParallelParam instance determining the parallel back-end to be used during building the object made by patchwork package.

return_grob

If TRUE then return a grob object instead of a wrapped patchwork object.

bg_color

Plot background color.

save

NULL or the file name used to save the plot.

verbose

Whether to print messages.

...

Unused.

Examples

library(ggplot2)
p <- ggplot(
  data = mtcars, aes(x = mpg, y = wt, colour = cyl)
) +
  geom_point() +
  facet_wrap(~gear, nrow = 2)
# fix the size of panel
panel_fix(
  p,
  width = 5,
  height = 3,
  units = "cm"
)

# rasterize the panel
panel_fix(
  p,
  width = 5,
  height = 3,
  units = "cm",
  raster = TRUE,
  dpi = 90
)


# `panel_fix` will build and render the plot when the input is a ggplot object.
# so after `panel_fix`, the size of the object will be changed.
object.size(p)
#> 14928 bytes
object.size(
  panel_fix(
    p,
    width = 5,
    height = 3,
    units = "cm"
  )
)
#> 668296 bytes

## save the plot with appropriate size
# p_fix <- panel_fix(
#   p,
#   width = 5,
#   height = 3,
#   units = "cm"
# )
# plot_size <- attr(p_fix, "size")
# ggsave(
#   filename = "p_fix.png",
#   plot = p_fix,
#   units = plot_size$units,
#   width = plot_size$width,
#   height = plot_size$height
# )
## or save the plot directly
# p_fix <- panel_fix(
#   p,
#   width = 5,
#   height = 3,
#   units = "cm",
#   save = "p_fix.png"
# )

# fix the panel of the plot combined by `patchwork`
data("pancreas_sub")
p1 <- CellDimPlot(
  pancreas_sub,
  "Phase",
  aspect.ratio = 1
)
p2 <- FeatureDimPlot(
  pancreas_sub,
  "Ins1",
  aspect.ratio = 0.5
)
p <- p1 / p2
# fix the panel size for each plot,
# the width will be calculated automatically based on `aspect.ratio`
panel_fix(p, height = 1)
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.


# fix the panel of the plot combined by plot_grid
if (requireNamespace("cowplot", quietly = TRUE)) {
  p1 <- CellDimPlot(
    pancreas_sub,
    c("Phase", "SubCellType"),
    label = TRUE
  )
  p2 <- FeatureDimPlot(
    pancreas_sub,
    c("Ins1", "Gcg"),
    label = TRUE
  )
  p <- cowplot::plot_grid(
    p1,
    p2,
    nrow = 2
  )
  # plot is combined by plot_grid
  # fix the size of panel for each plot
  panel_fix(p, height = 1)
  # rasterize the panel while keeping all labels and text in vector format
  panel_fix(p, height = 1, raster = TRUE, dpi = 30)
}
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.
#> Warning: No shared levels found between `names(values)` of the manual scale and the
#> data's fill values.


# fix the panel of the heatmap
ht <- GroupHeatmap(pancreas_sub,
  features = c(
    "Sox9", "Anxa2", "Bicc1", # Ductal
    "Neurog3", "Hes6", # EPs
    "Fev", "Neurod1", # Pre-endocrine
    "Rbp4", "Pyy", # Endocrine
    "Ins1", "Gcg", "Sst", "Ghrl"
    # Beta, Alpha, Delta, Epsilon
  ),
  group.by = c("CellType", "SubCellType"),
  show_row_names = TRUE
)
#> 'magick' package is suggested to install to give better rasterization.
#> 
#> Set `ht_opt$message = FALSE` to turn off this message.
# the size of the heatmap is not fixed and can be resized by zooming the viewport
ht$plot

# fix the size of the heatmap according the current viewport
panel_fix(ht$plot)

# rasterize the heatmap body
panel_fix(ht$plot, raster = TRUE, dpi = 30)

# fix the size of overall heatmap including annotation and legend
panel_fix(ht$plot, height = 4, width = 6)