vignettes/developing-patterns-2.Rmd
developing-patterns-2.RmdThis vignette shows how to:
create_pattern() function of the correct signature for a geometry-based patternAll geometry-based pattern creation functions must:
function(params, boundary_df, aspect_ratio, legend)
params - parameters from the geom (the aesthetics) e.g pattern_fill
boundary_df - data.frame containing polygon information i.e. The polygon_df format.aspect_ratio - the best guess that ggpattern is able to make as to the aspect ratio of the viewport in which this pattern is being rendered.legend logical value to indicate whether or not this function is being called to render a key legend or the in-place geom fill.grid::grobTree()
Parameters for this pattern:
pattern_shape to indicate the character to use for plottingpattern_size size of the plotted characterpattern_fill colour of the characterpattern_alpha character transparence
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#' Create a single character pointsGrob at the cenroid of the geom area
#'
#' @param params params/coords for a single element. named list or single row data.frame
#' @param boundary_df mask for the pattern rendering
#' @param aspect_ratio a aspect ratio of the plotting area.
#' @param legend is the pattern being created in the legend? default FALSE.
#' Use this flag if you want different pattern drawing behaviour for the legend.
#'
#' @return grid grob object
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
centroid_dot_pattern <- function(params, boundary_df, aspect_ratio, legend) {
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Convert the simple `boundary_df` polygon information into a
# simple features polygon object i.e. {sf}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
boundary_sf <- ggpattern::convert_polygon_df_to_polygon_sf(boundary_df)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Now that we have the boundary as an {sf} object, we can use a simple
# features' function to find the centroid
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
centroid <- sf::st_centroid(boundary_sf)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Create a single character at the cenroid
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
grid::pointsGrob(
x = centroid[1],
y = centroid[2],
pch = params$pattern_shape,
size = unit(params$pattern_size, 'char'),
gp = grid::gpar(
col = ggplot2::alpha(params$pattern_fill, params$pattern_alpha)
)
)
}{ggpattern} know that there’s an external pattern function it can useA global option (ggpattern_geometry_funcs) is a named list which contains geometry-based pattern creating functions to use outside of ggpattern.
The name used in this list corresponds to the pattern name used with the geom - in this case we will be using pattern = 'centroid'.
centroid patternThere is an included pattern = 'none' in ggpattern.
Here, a verbose version of the ‘none’ pattern is created. It still just returns an empty grob, but as a side-effect prints out the parameters set for this object.
df <- data.frame(
trt = c("a", "b", "c"),
outcome = c(2.3, 1.9, 3.2)
)
ggplot(df, aes(trt, outcome)) +
geom_col_pattern(
aes(
fill = trt,
pattern_shape = trt,
pattern_fill = trt
),
colour = 'black',
pattern = 'centroid',
pattern_size = 3
) +
theme_bw(15) +
labs(
title = "ggpattern::geom_col_pattern()",
subtitle = "pattern = 'centroid'"
) +
scale_pattern_fill_viridis_d() +
theme(legend.key.size = unit(2, 'cm')) +
coord_fixed(ratio = 1/2)
#> Loading required namespace: sf
ggpattern also includes some experimental patterns of varying completeness and complexity: