Introduction and first principles
The barplot() function in R produces vertical or horizontal bar charts from numeric vectors, matrices, or tables. It is part of base graphics and is commonly used to show counts, frequencies, or aggregated values across categories. This guide explains core arguments, data preparation steps, formatting options, and modern alternatives so you can create clear, reusable bar charts. Unlike news-driven references, these principles remain valid across recent R releases.
Basic syntax and input types
At its simplest, barplot(height) accepts a numeric vector or a single-column matrix. R treats each element as the height of a bar and labels them with names if available. When height is a matrix, bars are grouped side-by-side for each row unless beside = TRUE is set. Understanding these input types is essential because they determine how bars are grouped, stacked, and labeled in the plot.
Core arguments and defaults
height: numeric vector or matrix of values to plot.names.arg: labels for each bar (usually a character vector).main,xlab,ylab: titles and axis labels.col: color or vector of colors for bars.border: color of bar borders.densityandangle: patterns for grayscale shading.las: axis label orientation (0, 1, 2, or 3).
Essential data preparation steps
Clean and prepare your data before calling barplot(). Common steps include removing missing values, aggregating or summarizing with functions like tapply() or aggregate(), and ensuring consistent ordering. Well-structured data reduces mistakes and improves reproducibility. For counts derived from a factor variable, table() or dplyr::count() are reliable preprocessing choices.
Example: From vector to labeled plot
A minimal example creates a simple bar chart:
values Bars appear in alphabetical order when names are not explicitly preserved; always verify ordering matches your intent.
Grouped and stacked bars
Matrix input enables grouped or stacked bars, depending on beside and stacked settings (in barplot() with density or via ggplot2). Grouped bars are useful when comparing multiple series across categories, while stacked bars emphasize part-to-whole relationships. Proper labeling and legends are necessary to keep interpretations accurate and clear.
Visual enhancements and readability
- Use distinct colors or palettes to differentiate groups.
- Widen margins or reduce font size if labels overlap.
- Add reference lines with
abline(h = ...)for benchmarks. - Consider horizontal bars when category names are long.
Limitations and common pitfalls
barplot() does not support error bars natively; you must add them manually using arrows(). Standard bar plots represent only summary values and are not suitable for raw distributions. Avoid excessive 3D effects that distort perception of bar lengths. Always validate that gaps, widths, and scales do not misrepresent the data.
Modern alternatives and when to choose them
For more flexible grammar-of-graphics workflows, consider ggplot2 alternatives:
| Task | base R | ggplot2 |
|---|---|---|
| Simple counts | barplot(table(x)) | geom_bar(aes(x)) |
| Grouped comparisons | barplot(as.matrix(m, beside = TRUE)) | geom_col(aes(fill = group), position = position_dodge()) |
| Percent stacked | barplot(prop.table(m, 2), ...) | geom_col(position = "fill") |
geom_col() and geom_bar(stat = "identity") in ggplot2 handle grouping, stacking, and dodging more declaratively. For statistical summaries and faceting, ggplot2 is typically more concise and extensible.