Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # somewhat hackish solution to:
- # https://twitter.com/EamonCaddigan/status/646759751242620928
- # based mostly on copy/pasting from ggplot2 geom_violin source:
- # https://github.com/hadley/ggplot2/blob/master/R/geom-violin.r
- # library(ggplot2)
- # library(dplyr)
- "%||%" <- function(a, b) {
- if (!is.null(a)) a else b
- }
- geom_flat_violin <- function(mapping = NULL, data = NULL, stat = "ydensity",
- position = "dodge", trim = TRUE, scale = "area",
- show.legend = NA, inherit.aes = TRUE, ...) {
- layer(
- data = data,
- mapping = mapping,
- stat = stat,
- geom = GeomFlatViolin,
- position = position,
- show.legend = show.legend,
- inherit.aes = inherit.aes,
- params = list(
- trim = trim,
- scale = scale,
- ...
- )
- )
- }
- #' @rdname ggplot2-ggproto
- #' @format NULL
- #' @usage NULL
- #' @export
- GeomFlatViolin <-
- ggproto("GeomFlatViolin", Geom,
- setup_data = function(data, params) {
- data$width <- data$width %||%
- params$width %||% (resolution(data$x, FALSE) * 0.9)
- # ymin, ymax, xmin, and xmax define the bounding rectangle for each group
- data %>%
- group_by(group) %>%
- mutate(ymin = min(y),
- ymax = max(y),
- xmin = x,
- xmax = x + width / 2)
- # )
- },
- draw_group = function(data, panel_scales, coord) {
- # Find the points for the line to go all the way around
- data <- transform(data, xminv = x,
- xmaxv = x + violinwidth * (xmax - x))
- # Make sure it's sorted properly to draw the outline
- newdata <- rbind(plyr::arrange(transform(data, x = xminv), y),
- plyr::arrange(transform(data, x = xmaxv), -y))
- # Close the polygon: set first and last point the same
- # Needed for coord_polar and such
- newdata <- rbind(newdata, newdata[1,])
- ggplot2:::ggname("geom_flat_violin", GeomPolygon$draw_panel(newdata, panel_scales, coord))
- },
- draw_key = draw_key_polygon,
- default_aes = aes(weight = 1, colour = "grey20", fill = "white", size = 0.5,
- alpha = NA, linetype = "solid"),
- required_aes = c("x", "y")
- )
- # ### Example:
- # ggplot(diamonds, aes(cut, carat)) +
- # geom_flat_violin() +
- # coord_flip()
- #
- # # half violin plot with raw data ------------------------------------------
- #
- # ## create a violin plot of Sepal.Length per species
- # ## using the custom function geom_flat_violin()
- #
- # ggplot(data = iris,
- # mapping = aes(x = Species, y = Sepal.Length, fill = Species)) +
- # geom_flat_violin(scale = "count", trim = FALSE) +
- # stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
- # geom = "pointrange", position = position_nudge(0.05)) +
- # geom_dotplot(binaxis = "y", dotsize = 0.5, stackdir = "down", binwidth = 0.1,
- # position = position_nudge(-0.025)) +
- # theme(legend.position = "none") +
- # labs(x = "Species", y = "Sepal length (cm)")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement