Download PDF
Translations (PDF)
ggplot2 is based on the grammar of graphics, the idea that you can build every graph from the same components: a data set, a coordinate system, and geoms—visual marks that represent data points.
To display values, map variables in the data to visual properties of the geom (aesthetics) like size, color, and x and y locations.
Complete the template below to build a graph.
ggplot(data = <Data>) +
<Geom_Function>(mapping = aes(<Mappings>),
stat = <Stat>,
position = <Position>) +
<Coordinate_Function> +
<Facet_Function> +
<Scale_Function> +
<Theme_Function>
Data, a Geom Function, and Aes Mappings are required. Stat, Position, and the Coordinate, Facet, Scale, and Theme functions are not required and will supply sensible defaults.
ggplot(data = mpg, aes(x = cty, y = hwy))
: Begins a plot that you finish by adding layers to. Add one geom function per layer.
last_plot()
: Returns the last plot.
ggsave("plot.png", width = 5, height = 5)
: Saves last plot as 5’ x 5’ file named “plot.png” in working directory. Matches file type to file extension.
Common aesthetic values.
color
and fill
: String ("red"
, "#RRGGBB"
).
linetype
: Integer or string (0 = "blank"
, 1 = "solid"
, 2 = "dashed"
, 3 = "dotted"
, 4 = "dotdash"
, 5 = "longdash"
, 6 = "twodash"
).
size
: Integer (in mm for size of points and text).
linewidth
: Integer (in mm for widths of lines).
shape
: Integer/shape name or a single character ("a"
).
shape
integer/name pairs: 0 = "square open"
, 1 = "circle open"
, 2 = "triangle open"
, 3 = "plus"
, 4 = "cross"
, 5 = "diamond open"
, 6 = "triangle down open"
, 7 = "square cross"
, 8 = "asterisk"
, 9 = "diamond plus"
, 10 = "circle plus"
, 11 = "star"
, 12 = "square plus"
, 13 = "circle cross"
, 14 = "square triangle"
, 15 = "square"
, 16 = "circle"
, 17 = "triangle"
, 18 = "diamond"
, 19 = "circle small"
, 20 = "bullet"
, 21 = "circle filled"
, 22 = "square filled"
, 23 = "diamond filled"
, 24 = "triangle filled"
, 25 = "triangle down filled"
Use a geom function to represent data points, use the geom’s aesthetic properties to represent variables. Each function returns a layer.
a + geom_blank()
and a + expand_limits()
: Ensure limits include values across all plots.
b + geom_curve(aes(yend = lat + 1, xend = long + 1), curvature = 1)
: Draw a curved line from (x, y)
to (xend, yend)
. aes()
arguments: x
, xend
, y
, yend
, alpha
, angle
, color
, curvature
, linetype
, size
.
a + geom_path(lineend = "butt", linejoin = "round", linemitre = 1)
: Connect observations in the order they appear. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, size
.
a + geom_polygon(aes(alpha = 50))
: Connect points into polygons. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, subgroup
, linetype
, size
.
b + geom_rect(aes(xmin = long, ymin = lat, xmax = long + 1, ymax = lat + 1))
: Draw a rectangle by connecting four corners (xmin
, xmax
, ymin
, ymax
). aes()
arguments: xmax
, xmin
, ymax
, ymin
, alpha
, color
, fill
, linetype
, size
.
a + geom_ribbon(aes(ymin = unemploy - 900, ymax = unemploy + 900)
: For each x
, plot an interval from ymin
to ymax
. aes()
arguments: x
, ymax
, ymin
, alpha
, color
, fill
, group
, linetype
, size
.
Common aesthetics: x
, y
, alpha
, color
, linetype
, size
, linewidth
.
b + geom_abline(aes(intercept = 0, slope = 1))
: Draw a diagonal reference line with a given slope
and intercept
.
b + geom_hline(aes(yintercept = lat))
: Draw a horizontal reference line with a given yintercept
.
b + geom_vline(aes(xintercept = long))
: Draw a vertical reference line with a given xintercept
.
b + geom_segment(aes(yend = lat + 1, xend = long + 1))
: Draw a straight line from (x, y)
to (xend, yend)
.
b + geom_spoke(aes(angle = 1:1155, radius = 1))
: Draw line segments using polar coordinates (angle
and radius
).
c + geom_area(stat = "bin")
: Draw an area plot. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, linewidth
.
c + geom_density(kernel = "gaussian")
: Compute and draw kernel density estimates. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, linetype
, linewidth
, weight
.
c + geom_dotplot()
: Draw a dot plot. aes()
arguments: x
, y
, alpha
, color
, fill
.
c + geom_freqpoly()
: Draw a frequency polygon. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, linewidth
.
c + geom_histogram(binwidth = 5)
: Draw a histogram. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, linewidth
, weight
.
c2 + geom_qq(aes(sample = hwy))
: Draw a quantile-quantile plot. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, size
, weight
.
d + geom_bar()
: Draw a bar chart. aes()
arguments: x
, alpha
, color
, fill
, linetype
, linewidth
, weight
.e + geom_label(aes(label = cty), nudge_x = 1, nudge_y = 1)
: Add text with a rectangle background. aes()
arguments: - x
, y
, label
, alpha
, angle
, color
, family
, fontface
, hjust
, lineheight
, size
, vjust
.
e + geom_point()
: Draw a scatter plot. aes()
arguments: x
, y
, alpha
, color
, fill
, shape
, size
, stroke
.
e + geom_quantile()
: Fit and draw quantile regression for the plot data. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, linewidth
, weight
.
e + geom_rug(sides = "bl")
: Draw a rug plot. aes()
arguments: x
, y
, alpha
, color
, linetype
, linewidth
.
e + geom_smooth(method = lm)
: Plot smoothed conditional means. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, linetype
, linewidth
, weight
.
e + geom_text(aes(label = cty), nudge_x = 1, nudge_y = 1)
: Add text to a plot. aes()
arguments: x
, y
, label
, alpha
, angle
, color
, family
, fontface
, hjust
, lineheight
, size
, vjust
.
f + geom_col()
: Draw a bar plot. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, linetype
, linewidth
.
f + geom_boxplot()
: Draw a box plot. aes()
arguments: x
, y
, lower
, middle
, upper
, ymax
, ymin
, alpha
, color
, fill
, group
, linetype
, shape
, linewidth
, weight
.
f + geom_dotplot(binaxis ="y", stackdir = "center")
: Draw a dot plot. aes()
arguments: x
, y
, alpha
, color
, fill
, group
.
f + geom_violin(scale = "area")
: Draw a violin plot. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, linetype
, linewidth
, weight
.
g + geom_count()
: Plot a count of points in an area to address over plotting. aes()
arguments: x
, y
, alpha
, color
, fill
, shape
, size
, stroke
.
e + geom_jitter(height = 2, width = 2)
: Jitter points in a plot. aes()
arguments: x
, y
, alpha
, color
, fill
, shape
, size
.
h + geom_bin2d(binwidth = c(0.25, 500))
: Draw a heatmap of 2D rectangular bin counts. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, size
, weight
.
h + geom_density_2d()
: Plot contours from 2D kernel density estimation. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, linewidth
.
h + geom_hex()
: Draw a heatmap of 2D hexagonal bin counts. aes()
arguments: x
, y
, alpha
, color
, fill
, linewidth
.
i + geom_area()
: Draw an area plot. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, linewidth
.
i + geom_line()
: Connect data points, ordered by the x axis variable. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, linewidth
.
i + geom_step(direction = "hv"
: Draw a stairstep plot. aes()
arguments: x
, y
, alpha
, color
, group
, linetype
, linewidth
.
j + geom_crossbar(fatten = 2)
: Draw a crossbar. aes()
arguments: x
, y
, ymax
, ymin
, alpha
, color
, fill
, group
, linetype
, linewidth
.
j + geom_errorbar()
: Draw an errorbar. Also geom_errorbarh()
. aes()
arguments: x
, ymax
, ymin
, alpha
, color
, group
, linetype
, linewidth
, width
.
j + geom_linerange()
: Draw a line range. aes()
arguments: x
, ymin
, ymax
, alpha
, color
, group
, linetype
, linewidth
.
j + geom_pointrange()
: Draw a point range. aes()
arguments: x
, y
, ymin
, ymax
, alpha
, color
, fill
, group
, linetype
, shape
, linewidth
.
Draw the appropriate geometric object depending on the simple features present in the data. aes()
arguments: map_id
, alpha
, color
, fill
, linetype
, linewidth
.
l + geom_contour(aes(z = z))
: Draw 2D contour plot. aes()
arguments: x
, y
, z
, alpha
, color
, group
, linetype
, linewidth
, weight
.
l + geom_contour_filled(aes(fill = z))
: Draw 2D contour plot with the space between lines filled. aes()
arguments: x
, y
, alpha
, color
, fill
, group
, linetype
, linewidth
, subgroup
.
l + geom_raster(aes(fill = z), hjust = 0.5, vjust = 0.5, interpolate = FALSE)
: Draw a raster plot. aes()
arguments: x
, y
, alpha
, fill
.
l + geom_tile(aes(fill = z))
: Draw a tile plot. aes()
arguments: x
, y
, alpha
, color
, fill
, linetype
, linewidth
, width
.
An alternative way to build a layer.
A stat builds new variables to plot (e.g., count, prop).
Visualize a stat by changing the default stat of a geom function, geom_bar(stat = "count")
, or by using a stat function, stat_count(geom = "bar")
, which calls a default geom to make a layer (equivalent to a geom function). Use after_stat(name)
syntax to map the stat variable name
to an aesthetic.
In this example, "polygon"
is the geom to use, stat_density_2d()
is the stat function, aes()
contains the geom mappings, and level
is the variable created by stat.
c + stat_bin(binwidth = 1, boundary = 10)
: x
, y
| count
, ncount
, density
, ndensity
c + stat_count(width = 1)
: x
, y
| count
, density
c + stat_density(adjust = 1, kernel = "gaussian")
: x
, y
| count
, density
, scaled
e + stat_bin_2d(bins = 30, drop = T)
: x
, y
, fill
| count
, density
e + stat_bin_hex(bins =30)
: x
, y
, fill
| count
, density
e + stat_density_2d(contour = TRUE, n = 100)
: x
, y
, color
, linewidth
| level
e + stat_ellipse(level = 0.95, segments = 51, type = "t")
l + stat_contour(aes(z = z))
: x
, y
, z
, order
| level
l + stat_summary_hex(aes(z = z), bins = 30, fun = max)
: x
, y
, z
, fill
| value
l + stat_summary_2d(aes(z = z), bins = 30, fun = mean)
: x
, y
, z
, fill
| value
f + stat_boxplot(coef = 1.5)
: x
, y
| lower
, middle
, upper
, width
, ymin
, ymax
f + stat_ydensity(kernel = "gaussian", scale = "area")
: x
, y
| density
, scaled
, count
, n
, violinwidth
, width
e + stat_ecdf(n = 40)
: x
, y
| x
, y
e + stat_quantile(quantiles = c(0.1, 0.9), formula = y ~ log(x), method = "rq")
: x
, y
| quantile
e + stat_smooth(method = "lm", formula = y ~ x, se = T, level = 0.95)
: x
, y
| se
, x
, y
, ymin
, ymax
ggplot() + xlim(-5, 5) + stat_function(fun = dnorm, n = 20, geom = "point")
: x
| x
, y
ggplot() + stat_qq(aes(sample = 1:100))
: x
, y
, sample
| sample
, theoretical
e + stat_sum()
: x
, y
, size
| n
, prop
e + stat_summary(fun.data = "mean_cl_boot")
h + stat_summary_bin(fun = "mean", geom = "bar")
e + stat_identity()
e + stat_unique()
Override defaults with scales package.
Scales map data values to the visual values of an aesthetic. To change a mapping, add a new scale.
In this example, scale_
specifies a scale function, fill
is the aesthetic to adjust, and manual
is the prepackaged scale to use.
values
contains scale-specific arguments, limits
specifies the range of values to include in mappings, breaks
specifies the breaks to use in legend/axis, and name
and labels
specify the title and labels to use in the legend/axis.
Use with most aesthetics.
scale_*_continuous()
: Map continuous values to visual ones.
scale_*_discrete()
: Map discrete values to visual ones.
scale_*_binned()
: Map continuous values to discrete bins.
scale_*_identity()
: Use data values as visual ones.
scale_*_manual(values = c())
: Map discrete values to manually chosen visual ones.
scale_*_date(date_labels = "%m/%d", date_breaks = "2 weeks")
: Treat data values as dates.
scale_*_datetime()
: Treat data values as date times. Same as scale_*_date()
. See ?strptime
for label formats.
Use with x or y aesthetics (x shown here).
scale_x_log10()
: Plot x
on log10 scale.
scale_x_reverse()
: Reverse the direction of the x axis.
scale_x_sqrt()
: Plot x
on square root scale.
n + scale_fill_brewer(palette = "Blues")
: Use color scales from ColorBrewer. For palette choices RColorBrewer::display.brewer.all()
.
n + scale_fill_grey(start = 0.2, end = 0.8, na.value = "red")
: Use a grey gradient color scale.
o + scale_fill_distiller(palette = "Blues")
: Interpolate a palette into a continuous scale.
o + scale_fill_gradient(low = "red", high = "yellow")
: Create a two color gradient.
o + scale_fill_gradient2(low = "red", high = "blue", mid = "white", midpoint = 25)
: Create a diverging color gradient.
o + scale_fill_gradientn(colors = topo.colors(6))
: Create a n-color gradient. Also rainbow()
, heat.colors()
, terrain.colors()
, cm.colors()
, RColorBrewer::brewer.pal()
.
p + scale_shape() + scale_size()
: Map discrete values to shape and size aesthetics.
p + scale_shape_manual(values = c(3:7))
: Map discrete values to specified shape values.
p + scale_radius(range = c(1,6))
: Map values to a shape’s radius.
p + scale_size_area(max_size = 6)
: Like scale_size()
but maps zero values to zero size.
Shapes used here are the same as the ones listed in the Aes section.
u + coord_cartesian(xlim = c(0, 5))
: xlim
, ylim
. The default Cartesian coordinate system.
u + coord_fixed(ratio = 1/2)
: ratio
, xlim
, ylim
. Cartesian coordinates with fixed aspect ration between x and y units.
ggplot(mpg, aes(y = fl)) + geom_bar()
: Flip Cartesian coordinates by switching x and y aesthetic mappings.
u + coord_polar(theta = "x", direction = 1)
: theta
, start
, direction
. Polar coordinates.
u + coord_trans(y = "sqrt")
: x
, y
, xlim
, ylim
. Transformed Cartesian coordinates. Set xtrans
and ytrans
to the name of a window function.
π + coord_sf()
: xlim
, ylim
, crs
. Ensures all layers use a common Coordinate Reference System.
Position adjustments determine how to arrange geoms that would otherwise occupy the same space.
s + geom_bar(position = "dodge")
: Arrange elements side by side.
s + geom_bar(position = "fill")
: Stack elements on top of one another, normalize height.
e + geom_point(position = "jitter")
: Add random noise to X and Y position of each element to avoid over plotting.
e + geom_label(position = "nudge")
: Nudge labels away from points.
s + geom_bar(position = "stack")
: Stack elements on top of one another.
Each position adjustment can be recast as a function with manual width
and height
arguments:
u + theme_bw()
: White background with grid lines.
u + theme_gray()
: Grey background with white grid lines (default theme).
u + theme_dark()
: Dark grey background and grid lines for contrast.
u + theme_classic()
: No grid lines.
u + theme_light()
: Light grey axes and grid lines.
u + theme_linedraw()
: Uses only black lines.
u + theme_minimal()
: Minimal theme.
u + theme_void()
: Empty theme.
u + theme()
: Customize aspects of the theme such as axis, legend, panel, and facet properties.
Facets divide a plot into subplots based on the values of one or more discrete variables.
t + facet_grid(. ~ fl)
: Facet into a column based on fl.
t + facet_grid(year ~ .)
: Facet into rows based on year.
t + facet_grid(year ~ fl)
: Facet into both rows and columns.
t + facet_wrap(~ fl)
: Wrap facets into a rectangular layout.
t + facet_grid(drv ~ fl, scales = "free")
: Set scales to let axis limits vary across facets. Also "free_x"
for x axis limits adjust to individual facets and "free_y"
for y axis limits adjust to individual facets.
Set labeller to adjust facet label:
t + facet_grid(. ~ fl, labeller = label_both)
: Labels each facet as “fl: c”, “fl: d”, etc.
t + facet_grid(fl ~ ., labeller = label_bquote(alpha ^ .(fl)))
: Labels each facet as “𝛼c”, “𝛼d”, etc.
Use labs()
to label elements of your plot.
t + labs(x = "New x axis label",
y = "New y axis label",
title ="Add a title above the plot",
subtitle = "Add a subtitle below title",
caption = "Add a caption below plot",
alt = "Add alt text to the plot",
<Aes> = "New <Aes> legend title")
t + annotate(geom = "text", x = 8, y = 9, label = "A")
: Places a geom with manually selected aesthetics.
p + guides(x = guide_axis(n.dodge = 2))
: Avoid crowded or overlapping labels with guide_axis(n.dodge or angle)
.
n + guides(fill = "none")
: Set legend type for each aesthetic: colorbar
, legend
, or none
(no legend).
n + theme(legend.position = "bottom")
: Place legend at “bottom”, “top”, “left”, or “right”.
n + scale_fill_discrete(name = "Title", labels = c("A", "B", "C", "D", "E"))
: Set legend title and labels with a scale function.
t + coord_cartesian(xlim = c(0, 100), ylim = c(10,20))
: Zoom without clipping (preferred).
t + xlim(0, 100) + ylim(10, 20)
or t + scale_x_continuous(limits = c(0, 100)) + scale_y_continuous(limits = c(0, 100))
: Zoom with clipping (removes unseen data points).
CC BY SA Posit Software, PBC • info@posit.co • posit.co
Learn more at ggplot2.tidyverse.org.
Updated: 2024-05.