diff --git a/DESCRIPTION b/DESCRIPTION index ff40c96..5446ab5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: ggalt Title: Extra Coordinate Systems, 'Geoms', Statistical Transformations, Scales and Fonts for 'ggplot2' -Version: 0.2.0.9000 +Version: 0.3.0.9000 Maintainer: Bob Rudis Authors@R: c( person("Bob", "Rudis", email = "bob@rudis.net", role = c("aut", "cre")), @@ -59,6 +59,7 @@ Collate: 'geom_xspline2.r' 'ggalt-package.r' 'grob_absolute.r' + 'geom_lollipop.r' 'guide_axis.r' 'pokemon.r' 'stateface.r' diff --git a/NAMESPACE b/NAMESPACE index bd3b305..709d9ae 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,6 +10,7 @@ export(Gb) export(GeomBkde) export(GeomBkde2d) export(GeomEncircle) +export(GeomLollipop) export(GeomStateface) export(GeomXSpline2) export(GeomXspline) @@ -25,6 +26,7 @@ export(coord_proj) export(geom_bkde) export(geom_bkde2d) export(geom_encircle) +export(geom_lollipop) export(geom_stateface) export(geom_xspline) export(list_avatars) @@ -64,6 +66,8 @@ importFrom(grid,grobTree) importFrom(grid,grobWidth) importFrom(grid,grobX) importFrom(grid,grobY) +importFrom(grid,pointsGrob) +importFrom(grid,segmentsGrob) importFrom(grid,textGrob) importFrom(grid,unit.c) importFrom(grid,viewport) diff --git a/R/geom_lollipop.r b/R/geom_lollipop.r new file mode 100644 index 0000000..d4f5784 --- /dev/null +++ b/R/geom_lollipop.r @@ -0,0 +1,78 @@ +#' Lollipop charts +#' +#' The lollipop geom is used to create lollipop charts. +#' +#' Lollipop charts are the creation of Andy Cotgreave going back to 2011. They +#' are a combination of a thin segment, starting at with a dot at the top and are a +#' suitable alternative to or replacement for bar charts. +#' +#' The \emph{bubblechart} is a scatterplot with a third variable mapped to +#' the size of points. There are no special names for scatterplots where +#' another variable is mapped to point shape or colour, however. +#' +#' @section Aesthetics: +#' \Sexpr[results=rd,stage=build]{ggplot2:::rd_aesthetics("geom", "point")} +#' @inheritParams ggplot2::layer +#' @param na.rm If \code{FALSE} (the default), removes missing values with +#' a warning. If \code{TRUE} silently removes missing values. +#' @param ... other arguments passed on to \code{\link{layer}}. These are +#' often aesthetics, used to set an aesthetic to a fixed value, like +#' \code{color = "red"} or \code{size = 3}. They may also be parameters +#' to the paired geom/stat. +#' @param point.size the size of the point +#' @param point.colour the colour of the point +#' @inheritParams ggplot2::layer +#' @export +geom_lollipop <- function(mapping = NULL, data = NULL, ..., + point.colour = NULL, point.size = NULL, + na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { + + layer( + data = data, + mapping = mapping, + stat = "identity", + geom = GeomLollipop, + position = "identity", + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list( + na.rm = na.rm, + point.colour = point.colour, + point.size = point.size, + ... + ) + ) +} + +#' @rdname ggalt-ggproto +#' @format NULL +#' @usage NULL +#' @export +GeomLollipop <- ggproto("GeomLollipop", Geom, + required_aes = c("x", "y"), + non_missing_aes = c("size", "shape", "point.colour", "point.size"), + default_aes = aes( + shape = 19, colour = "black", size = 0.5, fill = NA, + alpha = NA, stroke = 0.5 + ), + + setup_data = function(data, params) { + transform(data, xend = x, yend = 0) + }, + + draw_group = function(data, panel_scales, coord, + point.colour = NULL, point.size = NULL) { + + points <- data + points$colour <- point.colour %||% data$colour + points$size <- point.size %||% (data$size * 2.5) + + gList( + ggplot2::GeomSegment$draw_panel(data, panel_scales, coord), + ggplot2::GeomPoint$draw_panel(points, panel_scales, coord) + ) + + }, + + draw_key = draw_key_point +) diff --git a/R/ggalt-package.r b/R/ggalt-package.r index bb4f30a..2b259a1 100644 --- a/R/ggalt-package.r +++ b/R/ggalt-package.r @@ -10,7 +10,8 @@ #' @importFrom dplyr filter #' @importFrom scales rescale expand_range #' @importFrom grid grobName grobTree unit.c grobHeight grobWidth viewport -#' grid.draw grobX grobY gTree gList textGrob gpar +#' grid.draw grobX grobY gTree gList textGrob gpar pointsGrob +#' segmentsGrob #' @importFrom gtable gtable_col gtable_height gtable_width gtable_row gtable_col #' @importFrom RColorBrewer brewer.pal #' @importFrom extrafont loadfonts fonts ttf_import diff --git a/man/geom_lollipop.Rd b/man/geom_lollipop.Rd new file mode 100644 index 0000000..6d7482c --- /dev/null +++ b/man/geom_lollipop.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/geom_lollipop.r +\name{geom_lollipop} +\alias{geom_lollipop} +\title{Lollipop charts} +\usage{ +geom_lollipop(mapping = NULL, data = NULL, ..., point.colour = NULL, + point.size = NULL, na.rm = FALSE, show.legend = NA, + inherit.aes = TRUE) +} +\arguments{ +\item{mapping}{Set of aesthetic mappings created by \code{\link{aes}} or +\code{\link{aes_}}. If specified and \code{inherit.aes = TRUE} (the +default), it is combined with the default mapping at the top level of the +plot. You must supply \code{mapping} if there is no plot mapping.} + +\item{data}{The data to be displayed in this layer. There are three + options: + + If \code{NULL}, the default, the data is inherited from the plot + data as specified in the call to \code{\link{ggplot}}. + + A \code{data.frame}, or other object, will override the plot + data. All objects will be fortified to produce a data frame. See + \code{\link{fortify}} for which variables will be created. + + A \code{function} will be called with a single argument, + the plot data. The return value must be a \code{data.frame.}, and + will be used as the layer data.} + +\item{...}{other arguments passed on to \code{\link{layer}}. These are +often aesthetics, used to set an aesthetic to a fixed value, like +\code{color = "red"} or \code{size = 3}. They may also be parameters +to the paired geom/stat.} + +\item{point.colour}{the colour of the point} + +\item{point.size}{the size of the point} + +\item{na.rm}{If \code{FALSE} (the default), removes missing values with +a warning. If \code{TRUE} silently removes missing values.} + +\item{show.legend}{logical. Should this layer be included in the legends? +\code{NA}, the default, includes if any aesthetics are mapped. +\code{FALSE} never includes, and \code{TRUE} always includes.} + +\item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, +rather than combining with them. This is most useful for helper functions +that define both data and aesthetics and shouldn't inherit behaviour from +the default plot specification, e.g. \code{\link{borders}}.} +} +\description{ +The lollipop geom is used to create lollipop charts. +} +\details{ +Lollipop charts are the creation of Andy Cotgreave going back to 2011. They +are a combination of a thin segment, starting at with a dot at the top and are a +suitable alternative to or replacement for bar charts. + +The \emph{bubblechart} is a scatterplot with a third variable mapped to +the size of points. There are no special names for scatterplots where +another variable is mapped to point shape or colour, however. +} +\section{Aesthetics}{ + +\Sexpr[results=rd,stage=build]{ggplot2:::rd_aesthetics("geom", "point")} +} + diff --git a/man/ggalt-ggproto.Rd b/man/ggalt-ggproto.Rd index e209d56..ddff248 100644 --- a/man/ggalt-ggproto.Rd +++ b/man/ggalt-ggproto.Rd @@ -1,11 +1,12 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/coord_proj.r, R/geom_ash.r, R/geom_bkde.r, R/geom_bkde2d.r, R/geom_encircle.r, R/geom_xspline.r, R/geom_xspline2.r, R/stateface.r +% Please edit documentation in R/coord_proj.r, R/geom_ash.r, R/geom_bkde.r, R/geom_bkde2d.r, R/geom_encircle.r, R/geom_xspline.r, R/geom_xspline2.r, R/geom_lollipop.r, R/stateface.r \docType{data} \name{CoordProj} \alias{CoordProj} \alias{GeomBkde} \alias{GeomBkde2d} \alias{GeomEncircle} +\alias{GeomLollipop} \alias{GeomStateface} \alias{GeomXSpline2} \alias{GeomXspline}