ggpattern provides custom ggplot2 geoms which support filled areas with geometric and image-based patterns.
Reading the articles/vignettes on the package website is probably the best way to get started.
pattern_alpha)You can install the development version from GitHub with:
# install.packages("remotes") remotes::install_github("coolbutuseless/ggpattern")
geom_col().{ggpattern} version of the geom e.g. ggpattern::geom_col_pattern() instead of ggplot2::geom_col()
pattern to your choice of pattern e.g pattern = 'stripe', and set other options using pattern_* aestheticsdf <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1)) ggplot(df) + geom_col_pattern( aes(level, outcome, pattern_fill = level), pattern = 'stripe', fill = 'white', colour = 'black' ) + theme_bw(18) + theme(legend.position = 'none') + labs( title = "ggpattern::geom_pattern_col()", subtitle = "pattern = 'stripe'" ) + coord_fixed(ratio = 1/2)

ggpattern includes versions of (nearly) all geoms from ggplot2 which could plausiblly support being filled with a pattern.
See the vignette galleries for examples of all the available geoms filled with geometry-based patterns and image-based/array-based patterns.
Click to show/hide list of supported geoms
| ggplot2 | ggpattern |
|---|---|
| geom_area | geom_area_pattern |
| geom_bar | geom_bar_pattern |
| geom_bin2d | geom_bin2d_pattern |
| geom_boxplot | geom_boxplot_pattern |
| geom_col | geom_col_pattern |
| geom_crossbar | geom_crossbar_pattern |
| geom_density | geom_density_pattern |
| geom_map | geom_map_pattern |
| geom_polygon | geom_polygon_pattern |
| geom_rect | geom_rect_pattern |
| geom_ribbon | geom_ribbon_pattern |
| geom_sf | geom_sf_pattern |
| geom_tile | geom_tile_pattern |
| geom_violin | geom_violin_pattern |
To control pattern appearance, a raft of new aesthetics have been added. e.g. pattern_alpha, pattern_filename, pattern_density.
There are also scale functions to control each of these new aesthetics e.g. scale_pattern_alpha_discrete.
Not all aesthetics apply to all patterns. See the individual pattern vignettes for which aesthetics it uses, or see the first vignette on developing user-defined patterns for a table of aesthetic use by pattern, or see the individual vignettes for each pattern.
Click to show/hide list of new aesthetics
| aesthetic | description | default | possible values |
|---|---|---|---|
pattern |
Name of the pattern to draw | ‘stripe’ | stripe, crosshatch, circle, image, placeholder, magick, gradient, plasma |
pattern_type |
Generic control option | NA | pattern-dependent |
pattern_subtype |
Generic control option | NA | pattern-dependent |
pattern_alpha |
Alpha | 1 | value in range 0, 1 (npc units) |
pattern_linetype |
Stroke linetype | 1 | linetype |
pattern_size |
Stroke linewidth | 1 | linewidth |
pattern_shape |
Plotting shape | 1 | shapes |
pattern_colour |
Stroke colour | ‘grey20’ | colour |
pattern_fill |
Fill colour | ‘grey80’ | colour |
pattern_fill2 |
Second fill colour | ‘#4169E1’ | colour |
pattern_angle |
Rotation angle | 30 | angle in degrees |
pattern_density |
Approx. fraction of area the pattern fills | 0.2 | value in range 0, 1 (fraction) |
pattern_spacing |
Spacing between repetitions of pattern | 0.05 | value in range 0, 1 (npc units) |
pattern_xoffset |
Shift pattern along x axis | 0 | value in range 0, 1 (npc units) |
pattern_yoffset |
Shift pattern along y axis | 0 | value in range 0, 1 (npc units) |
pattern_aspect_ratio |
Aspect ratio adjustment | NA | usual range 0.01, 10 |
pattern_key_scale_factor |
Scale factor for pattern in legend | 1 | |
pattern_filename |
Image filename/URL | ’’ | Filename/URL |
pattern_gravity |
Image placement | ‘center’ | ggpattern::magick_gravity_names |
pattern_filter |
Image scaling filter | ‘lanczos’ | ggpattern::magick_filter_names |
pattern_scale |
Scale | 1 | Multiplier |
pattern_orientation |
Orientation | ‘vertical’ | ‘vertical’, ‘horizontal’, ‘radial’ |
pattern_phase |
Phase | 0 | |
pattern_frequency |
Frequency | 0.1 | |
pattern_option_1 - 5 |
Generic options for expansion | 0 |
Users can write their own pattern functions and ask ggpattern to use them, without having to include the pattern in the package.
See the vignettes on developing patterns ( 1 2, 3 ) for how to do this, and see the vignettes on experimental patterns to see this in action ( Point filling, Hex pattern, Ambient Noise ).
These are patterns that aren’t quite ready for prime-time. Feel free to steal the code and extend to suit your needs.
coord_fixed() to ensure the aspect ratio is calculated correctly. Use pattern_aspect_ratio to override the internal calculation, of for occasions where you can’t use coord_fixed() because a different coord_*() is used.pattern_key_scale_factor to adjust legend appearance.geom_circle() and geom_voronoi() from ggforce