@@ -197,6 +197,169 @@ mark_density <- S7::new_generic(
197197)
198198._register_mark_method(mark_density , ggplot2 :: geom_density )
199199
200+ # ---- mark_area ----
201+ # ' Area layer
202+ # '
203+ # ' Adds a filled area layer. Use for stacked area charts, stream graphs,
204+ # ' or error bands.
205+ # '
206+ # ' @param plot A plotit object
207+ # ' @param mapping Optional new aesthetics
208+ # ' @param data Optional data for this layer
209+ # ' @param position Position adjustment.
210+ # ' @param rasterize If `TRUE`, rasterize via `ggrastr::rasterise()`.
211+ # ' @param rasterize_dpi DPI for rasterization (default 300).
212+ # ' @param rasterize_dev Graphics device for rasterization (default `"cairo"`).
213+ # ' @param ... Other arguments passed to `geom_area`
214+ # ' @return Modified plotit object
215+ # ' @examples
216+ # ' plotit(ggplot2::economics, encode(x = date, y = unemploy)) |>
217+ # ' mark_area(alpha = 0.5)
218+ # ' @export
219+ mark_area <- S7 :: new_generic(
220+ " mark_area" , " plot" ,
221+ function (plot , mapping = NULL , data = NULL , position = NULL , ... ,
222+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
223+ S7 :: S7_dispatch()
224+ }
225+ )
226+ ._register_mark_method(mark_area , ggplot2 :: geom_area )
227+
228+ # ---- mark_text ----
229+ # ' Text layer
230+ # '
231+ # ' Adds a text label layer. For automatic label placement with collision
232+ # ' avoidance, install the optional \pkg{ggrepel} package and set
233+ # ' `repel = TRUE`.
234+ # '
235+ # ' @param plot A plotit object
236+ # ' @param mapping Optional new aesthetics (e.g. `encode(label = ...)`)
237+ # ' @param data Optional data for this layer
238+ # ' @param position Position adjustment.
239+ # ' @param repel If `TRUE`, use `ggrepel::geom_text_repel` instead of
240+ # ' `geom_text`. Requires the \pkg{ggrepel} package.
241+ # ' @param rasterize If `TRUE`, rasterize via `ggrastr::rasterise()`.
242+ # ' @param rasterize_dpi DPI for rasterization (default 300).
243+ # ' @param rasterize_dev Graphics device for rasterization (default `"cairo"`).
244+ # ' @param ... Other arguments passed to `geom_text` or `geom_text_repel`
245+ # ' @return Modified plotit object
246+ # ' @examples
247+ # ' plotit(mtcars, encode(x = wt, y = mpg, label = rownames(mtcars))) |>
248+ # ' mark_text(size = 3)
249+ # ' @export
250+ mark_text <- S7 :: new_generic(
251+ " mark_text" , " plot" ,
252+ function (plot , mapping = NULL , data = NULL , position = NULL , ... ,
253+ repel = FALSE ,
254+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
255+ S7 :: S7_dispatch()
256+ }
257+ )
258+
259+ # ' @export
260+ S7 :: method(mark_text , plotit_class ) <- function (
261+ plot , mapping = NULL , data = NULL , position = NULL , ... ,
262+ repel = FALSE ,
263+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
264+ if (repel ) {
265+ if (! requireNamespace(" ggrepel" , quietly = TRUE )) {
266+ cli :: cli_abort(" {.arg repel = TRUE} requires the {.pkg ggrepel} package." )
267+ }
268+ geom_fun <- ggrepel :: geom_text_repel
269+ } else {
270+ geom_fun <- ggplot2 :: geom_text
271+ }
272+ if (! is.null(mapping ) && ! is.null(mapping $ colour )) {
273+ plot <- ._clear_default_color(plot , mapping )
274+ }
275+ ._mark_impl(
276+ plot , mapping , data , position , geom_fun ,
277+ rasterize , rasterize_dpi , rasterize_dev , ...
278+ )
279+ }
280+
281+ # ---- mark_violin ----
282+ # ' Violin layer
283+ # '
284+ # ' Adds a violin plot layer showing the kernel density estimate of the data
285+ # ' at each position.
286+ # '
287+ # ' @param plot A plotit object
288+ # ' @param mapping Optional new aesthetics
289+ # ' @param data Optional data for this layer
290+ # ' @param position Position adjustment.
291+ # ' @param rasterize If `TRUE`, rasterize via `ggrastr::rasterise()`.
292+ # ' @param rasterize_dpi DPI for rasterization (default 300).
293+ # ' @param rasterize_dev Graphics device for rasterization (default `"cairo"`).
294+ # ' @param ... Other arguments passed to `geom_violin`
295+ # ' @return Modified plotit object
296+ # ' @examples
297+ # ' plotit(iris, encode(x = Species, y = Sepal.Length)) |>
298+ # ' mark_violin(draw_quantiles = 0.5)
299+ # ' @export
300+ mark_violin <- S7 :: new_generic(
301+ " mark_violin" , " plot" ,
302+ function (plot , mapping = NULL , data = NULL , position = NULL , ... ,
303+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
304+ S7 :: S7_dispatch()
305+ }
306+ )
307+ ._register_mark_method(mark_violin , ggplot2 :: geom_violin )
308+
309+ # ---- mark_map ----
310+ # ' Map layer
311+ # '
312+ # ' Adds a geographic map layer for \pkg{sf} spatial data frames.
313+ # ' Requires the \pkg{sf} package.
314+ # '
315+ # ' @param plot A plotit object
316+ # ' @param mapping Optional new aesthetics
317+ # ' @param data Optional sf data frame for this layer
318+ # ' @param position Position adjustment.
319+ # ' @param rasterize If `TRUE`, rasterize via `ggrastr::rasterise()`.
320+ # ' @param rasterize_dpi DPI for rasterization (default 300).
321+ # ' @param rasterize_dev Graphics device for rasterization (default `"cairo"`).
322+ # ' @param ... Other arguments passed to `geom_sf`
323+ # ' @return Modified plotit object
324+ # ' @examples
325+ # ' \dontrun{
326+ # ' nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
327+ # ' plotit(nc, encode(geometry = geometry)) |> mark_map()
328+ # ' }
329+ # ' @export
330+ mark_map <- S7 :: new_generic(
331+ " mark_map" , " plot" ,
332+ function (plot , mapping = NULL , data = NULL , position = NULL , ... ,
333+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
334+ S7 :: S7_dispatch()
335+ }
336+ )
337+
338+ # ' @export
339+ S7 :: method(mark_map , plotit_class ) <- function (
340+ plot , mapping = NULL , data = NULL , position = NULL , ... ,
341+ rasterize = FALSE , rasterize_dpi = 300 , rasterize_dev = " cairo" ) {
342+ if (! requireNamespace(" sf" , quietly = TRUE )) {
343+ cli :: cli_abort(" {.fn mark_map} requires the {.pkg sf} package." )
344+ }
345+ layer_data <- data %|| % plot @ gg $ data
346+ if (! inherits(layer_data , " sf" )) {
347+ cli :: cli_abort(c(
348+ " {.fn mark_map} requires {.pkg sf} spatial data." ,
349+ " i" = " Use {.fn plotit} with an {.cls sf} data frame."
350+ ))
351+ }
352+ # geom_sf does not support position adjustment; ignore dodge
353+ if (! is.null(mapping ) && ! is.null(mapping $ colour )) {
354+ plot <- ._clear_default_color(plot , mapping )
355+ }
356+ geom <- ggplot2 :: geom_sf(mapping = mapping , data = data , ... )
357+ .add_geom(plot , geom ,
358+ rasterize = rasterize , rasterize_dpi = rasterize_dpi ,
359+ rasterize_dev = rasterize_dev
360+ )
361+ }
362+
200363# ---- mark_bar (hand-written: geom_col vs geom_bar dispatch) ----
201364# ' Bar layer
202365# '
0 commit comments