@ -0,0 +1,8 @@ |
|||
^.*\.Rproj$ |
|||
^\.Rproj\.user$ |
|||
^README\.Rmd$ |
|||
^README-.*\.png$ |
|||
^\.travis\.yml$ |
|||
^CONDUCT\.md$ |
|||
^README\.md$ |
|||
^README_figs |
@ -0,0 +1,3 @@ |
|||
.Rproj.user |
|||
.Rhistory |
|||
.RData |
@ -0,0 +1,5 @@ |
|||
# Sample .travis.yml for R projects |
|||
|
|||
language: r |
|||
warnings_are_errors: true |
|||
sudo: required |
@ -0,0 +1,25 @@ |
|||
# Contributor Code of Conduct |
|||
|
|||
As contributors and maintainers of this project, we pledge to respect all people who |
|||
contribute through reporting issues, posting feature requests, updating documentation, |
|||
submitting pull requests or patches, and other activities. |
|||
|
|||
We are committed to making participation in this project a harassment-free experience for |
|||
everyone, regardless of level of experience, gender, gender identity and expression, |
|||
sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. |
|||
|
|||
Examples of unacceptable behavior by participants include the use of sexual language or |
|||
imagery, derogatory comments or personal attacks, trolling, public or private harassment, |
|||
insults, or other unprofessional conduct. |
|||
|
|||
Project maintainers have the right and responsibility to remove, edit, or reject comments, |
|||
commits, code, wiki edits, issues, and other contributions that are not aligned to this |
|||
Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed |
|||
from the project team. |
|||
|
|||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by |
|||
opening an issue or contacting one or more of the project maintainers. |
|||
|
|||
This Code of Conduct is adapted from the Contributor Covenant |
|||
(http:contributor-covenant.org), version 1.0.0, available at |
|||
http://contributor-covenant.org/version/1/0/0/ |
@ -0,0 +1,11 @@ |
|||
Package: ggalt |
|||
Title: Extra Geoms, Stats and Coords for 'ggplot2' |
|||
Version: 0.0.1.9001 |
|||
Authors@R: c(person("Bob", "Rudis", email = "bob@rudis.net", role = c("aut", "cre"))) |
|||
Description: A package contains additional geoms, coords and stats for the revamped (late 2015) version of ggplot2. |
|||
Depends: R (>= 3.0.0), ggplot2 (>= 1.0.1.9003) |
|||
License: AGPL + file LICENSE |
|||
LazyData: true |
|||
Suggests: testthat |
|||
Encoding: UTF-8 |
|||
Imports: graphics, grDevices, dplyr, KernSmooth |
@ -0,0 +1,2 @@ |
|||
YEAR: 2015 |
|||
COPYRIGHT HOLDER: Bob Rudis |
@ -0,0 +1,15 @@ |
|||
# Generated by roxygen2 (4.1.1): do not edit by hand |
|||
|
|||
export(GeomBkde) |
|||
export(GeomXspline) |
|||
export(StatBkde) |
|||
export(StatXspline) |
|||
export(geom_bkde) |
|||
export(geom_xspline) |
|||
export(stat_bkde) |
|||
export(stat_xspline) |
|||
import(KernSmooth) |
|||
import(dplyr) |
|||
import(ggplot2) |
|||
import(grDevices) |
|||
import(graphics) |
@ -0,0 +1,145 @@ |
|||
#' Display a smooth density estimate. |
|||
#' |
|||
#' A kernel density estimate, useful for display the distribution of variables |
|||
#' with underlying smoothness. |
|||
#' |
|||
#' @section Aesthetics: |
|||
#' \code{geom_bkde} understands the following aesthetics (required aesthetics |
|||
#' are in bold): |
|||
#' \itemize{ |
|||
#' \item \strong{\code{x}} |
|||
#' \item \strong{\code{y}} |
|||
#' \item \code{alpha} |
|||
#' \item \code{color} |
|||
#' \item \code{fill} |
|||
#' \item \code{linetype} |
|||
#' \item \code{size} |
|||
#' } |
|||
#' |
|||
#' @param geom,stat Use to override the default connection between |
|||
#' \code{geom_bkde} and \code{stat_bkde}. |
|||
#' @seealso See \code{\link{geom_histogram}}, \code{\link{geom_freqpoly}} for |
|||
#' other methods of displaying continuous distribution. |
|||
#' See \code{\link{geom_violin}} for a compact density display. |
|||
#' @inheritParams ggplot2::geom_point |
|||
#' @export |
|||
geom_bkde <- function(mapping = NULL, data = NULL, stat = "bkde", |
|||
position = "identity", bandwidth, range.x=NULL, show.legend = NA, inherit.aes = TRUE, |
|||
...) { |
|||
|
|||
layer( |
|||
data = data, |
|||
mapping = mapping, |
|||
stat = stat, |
|||
geom = GeomBkde, |
|||
position = position, |
|||
show.legend = show.legend, |
|||
inherit.aes = inherit.aes, |
|||
params = list(range.x=range.x, |
|||
...) |
|||
) |
|||
} |
|||
|
|||
#' @rdname ggalt-ggproto |
|||
#' @format NULL |
|||
#' @usage NULL |
|||
#' @export |
|||
GeomBkde <- ggproto("GeomBkde", GeomArea, |
|||
default_aes = aes(colour = NA, fill = "grey20", size = 0.5, linetype = 1, alpha = NA) |
|||
) |
|||
|
|||
|
|||
#' @param bandwidth the kernel bandwidth smoothing parameter. see |
|||
#' \code{\link[KernSmooth]{bkde}} for details |
|||
#' @param kernel character string which determines the smoothing kernel. see |
|||
#' \code{\link[KernSmooth]{bkde}} for details |
|||
#' @param canonical logical flag: if TRUE, canonically scaled kernels are used. |
|||
#' see \code{\link[KernSmooth]{bkde}} for details |
|||
#' @param gridsize the number of equally spaced points at which to estimate the |
|||
#' density. see \code{\link[KernSmooth]{bkde}} for details |
|||
#' @param range.x vector containing the minimum and maximum values of x at which |
|||
#' to compute the estimate. see \code{\link[KernSmooth]{bkde}} for details |
|||
#' @param truncate logical flag: if TRUE, data with x values outside the range |
|||
#' specified by range.x are ignored. see \code{\link[KernSmooth]{bkde}} |
|||
#' for details |
|||
#' @section Computed variables: |
|||
#' \describe{ |
|||
#' \item{density}{density estimate} |
|||
#' \item{count}{density * number of points - useful for stacked density |
|||
#' plots} |
|||
#' \item{scaled}{density estimate, scaled to maximum of 1} |
|||
#' } |
|||
#' @export |
|||
#' @rdname geom_bkde |
|||
#' @examples |
|||
#' data(geyser, package="MASS") |
|||
#' |
|||
#' ggplot(geyser, aes(x=duration)) + |
|||
#' stat_bkde(bandwidth=0.25) |
|||
#' |
|||
#' ggplot(geyser, aes(x=duration)) + |
|||
#' geom_bkde(bandwidth=0.25) |
|||
stat_bkde <- function(mapping = NULL, data = NULL, geom = "area", |
|||
position = "stack", kernel="normal", canonical=FALSE, bandwidth, gridsize=410, |
|||
range.x=NULL, truncate=TRUE, show.legend = NA, inherit.aes = TRUE, ...) { |
|||
|
|||
layer( |
|||
data = data, |
|||
mapping = mapping, |
|||
stat = StatBkde, |
|||
geom = geom, |
|||
position = position, |
|||
show.legend = show.legend, |
|||
inherit.aes = inherit.aes, |
|||
params = list( |
|||
kernel=kernel, |
|||
canonical=canonical, |
|||
bandwidth=bandwidth, |
|||
gridsize=gridsize, |
|||
range.x=range.x, |
|||
truncate=truncate, |
|||
... |
|||
) |
|||
) |
|||
} |
|||
|
|||
#' @rdname ggalt-ggproto |
|||
#' @format NULL |
|||
#' @usage NULL |
|||
#' @export |
|||
StatBkde <- ggproto("StatBkde", Stat, |
|||
|
|||
required_aes = "x", |
|||
|
|||
default_aes = aes(y = ..density.., fill = NA), |
|||
|
|||
compute_group = function(data, scales, kernel="normal", canonical=FALSE, |
|||
bandwidth, gridsize=410, range.x, truncate=TRUE) { |
|||
|
|||
if (missing(range.x) | is.null(range.x)) range.x <- range(data$x) |
|||
|
|||
compute_bkde(data$x, kernel=kernel, canonical=canonical, |
|||
bandwidth=bandwidth, gridsize=gridsize, range.x=range.x, |
|||
truncate=truncate) |
|||
|
|||
} |
|||
|
|||
) |
|||
|
|||
compute_bkde <- function(x, kernel="normal", canonical=FALSE, |
|||
bandwidth, gridsize=410, range.x, truncate=TRUE) { |
|||
|
|||
n <- length(x) |
|||
|
|||
if (missing(range.x) | is.null(range.x)) range.x <- range(x) |
|||
|
|||
dens <- KernSmooth::bkde(x, kernel, canonical, bandwidth, gridsize, range.x, truncate) |
|||
|
|||
data.frame( |
|||
x = dens$x, |
|||
density = dens$y, |
|||
scaled = dens$y / max(dens$y, na.rm = TRUE), |
|||
count = dens$y * n, |
|||
n = n |
|||
) |
|||
} |
@ -0,0 +1,209 @@ |
|||
#' Connect control points/observations with an X-spline |
|||
#' |
|||
#' Draw an X-spline, a curve drawn relative to control points/observations. |
|||
#' Patterned after \code{geom_line} in that it orders the points by \code{x} |
|||
#' first before computing the splines. |
|||
#' |
|||
#' @section Aesthetics: |
|||
#' \code{geom_xspline} understands the following aesthetics (required aesthetics |
|||
#' are in bold): |
|||
#' \itemize{ |
|||
#' \item \strong{\code{x}} |
|||
#' \item \strong{\code{y}} |
|||
#' \item \code{alpha} |
|||
#' \item \code{color} |
|||
#' \item \code{linetype} |
|||
#' \item \code{size} |
|||
#' } |
|||
#' |
|||
#' @seealso |
|||
#' \code{\link[ggplot2]{geom_line}}: Connect observations (x order); |
|||
#' \code{\link[ggplot2]{geom_path}}: Connect observations; |
|||
#' \code{\link[ggplot2]{geom_polygon}}: Filled paths (polygons); |
|||
#' \code{\link[ggplot2]{geom_segment}}: Line segments; |
|||
#' \code{\link[graphics]{xspline}}; |
|||
#' \code{\link[grid]{grid.xspline}} |
|||
#' |
|||
#' @details |
|||
#' An X-spline is a line drawn relative to control points. For each control |
|||
#' point, the line may pass through (interpolate) the control point or it may |
|||
#' only approach (approximate) the control point; the behaviour is determined |
|||
#' by a shape parameter for each control point. |
|||
#' |
|||
#' If the shape parameter is greater than zero, the spline approximates the |
|||
#' control points (and is very similar to a cubic B-spline when the shape is |
|||
#' 1). If the shape parameter is less than zero, the spline interpolates the |
|||
#' control points (and is very similar to a Catmull-Rom spline when the shape |
|||
#' is -1). If the shape parameter is 0, the spline forms a sharp corner at that |
|||
#' control point. |
|||
#' |
|||
#' For open X-splines, the start and end control points must have a shape of |
|||
#' 0 (and non-zero values are silently converted to zero). |
|||
#' |
|||
#' For open X-splines, by default the start and end control points are |
|||
#' replicated before the curve is drawn. A curve is drawn between (interpolating |
|||
#' or approximating) the second and third of each set of four control points, |
|||
#' so this default behaviour ensures that the resulting curve starts at the |
|||
#' first control point you have specified and ends at the last control point. |
|||
#' The default behaviour can be turned off via the repEnds argument. |
|||
#' |
|||
#' @inheritParams ggplot2::geom_line |
|||
#' @param geom,stat Use to override the default connection between |
|||
#' \code{geom_xspline} and \code{stat_xspline}. |
|||
#' @param spline_shape A numeric vector of values between -1 and 1, which |
|||
#' control the shape of the spline relative to the control points. |
|||
#' @param open A logical value indicating whether the spline is an open or a |
|||
#' closed shape. |
|||
#' @param rep_ends For open X-splines, a logical value indicating whether the |
|||
#' first and last control points should be replicated for drawing the |
|||
#' curve. Ignored for closed X-splines. |
|||
#' @references Blanc, C. and Schlick, C. (1995), "X-splines : A Spline Model |
|||
#' Designed for the End User", in \emph{Proceedings of SIGGRAPH 95}, |
|||
#' pp. 377-386. \url{http://dept-info.labri.fr/~schlick/DOC/sig1.html} |
|||
#' @export |
|||
#' @examples |
|||
#' set.seed(1492) |
|||
#' dat <- data.frame(x=c(1:10, 1:10, 1:10), |
|||
#' y=c(sample(15:30, 10), 2*sample(15:30, 10), |
|||
#' 3*sample(15:30, 10)), |
|||
#' group=factor(c(rep(1, 10), rep(2, 10), rep(3, 10))) |
|||
#' ) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=group)) + |
|||
#' geom_point() + |
|||
#' geom_line() |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point() + |
|||
#' geom_line() + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(spline_shape=-0.4, size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(spline_shape=0.4, size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(spline_shape=1, size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(spline_shape=0, size=0.5) |
|||
#' |
|||
#' ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
#' geom_point(color="black") + |
|||
#' geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
#' geom_xspline(spline_shape=-1, size=0.5) |
|||
geom_xspline <- function(mapping = NULL, data = NULL, stat = "xspline", |
|||
position = "identity", show.legend = NA, |
|||
inherit.aes = TRUE, na.rm = TRUE, |
|||
spline_shape=-0.25, open=TRUE, rep_ends=TRUE, ...) { |
|||
layer( |
|||
geom = GeomXspline, |
|||
mapping = mapping, |
|||
data = data, |
|||
stat = stat, |
|||
position = position, |
|||
show.legend = show.legend, |
|||
inherit.aes = inherit.aes, |
|||
params = list(spline_shape=spline_shape, |
|||
open=open, |
|||
rep_ends=rep_ends, |
|||
...) |
|||
) |
|||
} |
|||
|
|||
#' GeomXspline |
|||
#' @rdname ggalt-ggproto |
|||
#' @format NULL |
|||
#' @usage NULL |
|||
#' @export |
|||
GeomXspline <- ggproto("GeomXspline", GeomLine, |
|||
|
|||
required_aes = c("x", "y"), |
|||
|
|||
default_aes = aes(colour = "black", size = 0.5, linetype = 1, alpha = NA) |
|||
|
|||
) |
|||
|
|||
#' @export |
|||
#' @rdname geom_xspline |
|||
#' @section Computed variables: |
|||
#' \itemize{ |
|||
#' \item{x} |
|||
#' \item{y} |
|||
#' } |
|||
stat_xspline <- function(mapping = NULL, data = NULL, geom = "line", |
|||
position = "identity", show.legend = NA, inherit.aes = TRUE, |
|||
spline_shape=-0.25, open=TRUE, rep_ends=TRUE, ...) { |
|||
layer( |
|||
stat = StatXspline, |
|||
data = data, |
|||
mapping = mapping, |
|||
geom = geom, |
|||
position = position, |
|||
show.legend = show.legend, |
|||
inherit.aes = inherit.aes, |
|||
params = list(spline_shape=spline_shape, |
|||
open=open, |
|||
rep_ends=rep_ends, |
|||
... |
|||
) |
|||
) |
|||
} |
|||
|
|||
#' @rdname ggalt-ggproto |
|||
#' @format NULL |
|||
#' @usage NULL |
|||
#' @export |
|||
StatXspline <- ggproto("StatXspline", Stat, |
|||
|
|||
required_aes = c("x", "y"), |
|||
|
|||
setup_params = function(data, params) { |
|||
params |
|||
}, |
|||
|
|||
compute_group = function(self, data, scales, params, |
|||
spline_shape=-0.25, open=TRUE, rep_ends=TRUE) { |
|||
tf <- tempfile(fileext=".png") |
|||
png(tf) |
|||
plot.new() |
|||
tmp <- xspline(data$x, data$y, spline_shape, open, rep_ends, draw=FALSE, NA, NA) |
|||
invisible(dev.off()) |
|||
unlink(tf) |
|||
|
|||
data.frame(x=tmp$x, y=tmp$y) |
|||
} |
|||
) |
|||
|
|||
# function to do the xspline interpolation and return a data.frame since we have |
|||
# to do this graphics device wrapper |
|||
xspline_int <- function(dat, shape, open, rep_ends) { |
|||
|
|||
# despite the "draw=FALSE" parameter, xspline still |
|||
# tries to use the graphics device so we have to |
|||
# do this to work around it |
|||
tf <- tempfile(fileext=".png") |
|||
png(tf) |
|||
plot.new() |
|||
tmp <- xspline(dat$x, dat$y, shape, open, rep_ends, draw=FALSE, NA, NA) |
|||
invisible(dev.off()) |
|||
unlink(tf) |
|||
|
|||
data.frame(x=tmp$x, y=tmp$y) |
|||
|
|||
} |
@ -0,0 +1,10 @@ |
|||
#' Extra Geoms, Stats and Coords for 'ggplot2' |
|||
#' |
|||
#' A package containing additional geoms, coords and stats for the revamped (late 2015) version |
|||
#' of ggplot2. |
|||
#' |
|||
#' @name ggalt |
|||
#' @docType package |
|||
#' @author Bob Rudis (@@hrbrmstr) |
|||
#' @import ggplot2 graphics grDevices dplyr KernSmooth |
|||
NULL |
@ -0,0 +1,132 @@ |
|||
--- |
|||
output: |
|||
md_document: |
|||
variant: markdown_github |
|||
--- |
|||
|
|||
<!-- README.md is generated from README.Rmd. Please edit that file --> |
|||
|
|||
```{r, echo = FALSE} |
|||
knitr::opts_chunk$set( |
|||
collapse = TRUE, |
|||
comment = "#>", |
|||
fig.retina = 2, |
|||
fig.path = "README_figs/README-" |
|||
) |
|||
``` |
|||
|
|||
`ggalt` : Extra Geoms, Stats and Coords for `ggplot2` |
|||
|
|||
A package containing additional geoms, coords and stats for the revamped (late 2015) version |
|||
of ggplot2. |
|||
|
|||
The first two forays into this brave, new `ggplot2` world are _splines_! and being able to |
|||
use the (much better) `KernSmooth::bkde` for density plots. |
|||
|
|||
*NOTE* |
|||
|
|||
Until the new `ggplot2` version is on CRAN, you'll need to install it from github (see below). |
|||
|
|||
The following functions are implemented: |
|||
|
|||
- `geom_xspline` : Connect control points/observations with an X-spline |
|||
- `stat_xspline` : Connect control points/observations with an X-spline |
|||
- `geom_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) |
|||
- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) |
|||
|
|||
### News |
|||
|
|||
- Version 0.0.1.9000 released |
|||
|
|||
### Installation |
|||
|
|||
```{r eval=FALSE} |
|||
# you'll want to see the vignettes, trust me |
|||
devtools::install_github("hadley/ggplot2", build_vignettes=TRUE) |
|||
devtools::install_github("hrbrmstr/ggalt") |
|||
``` |
|||
|
|||
```{r echo=FALSE, message=FALSE, warning=FALSE, error=FALSE} |
|||
options(width=120) |
|||
``` |
|||
|
|||
### Usage |
|||
|
|||
```{r} |
|||
library(ggalt) |
|||
|
|||
# current verison |
|||
packageVersion("ggalt") |
|||
|
|||
set.seed(1492) |
|||
dat <- data.frame(x=c(1:10, 1:10, 1:10), |
|||
y=c(sample(15:30, 10), 2*sample(15:30, 10), 3*sample(15:30, 10)), |
|||
group=factor(c(rep(1, 10), rep(2, 10), rep(3, 10))) |
|||
) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=group)) + |
|||
geom_point() + |
|||
geom_line() |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point() + |
|||
geom_line() + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-0.4, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0.4, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=1, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-1, size=0.5) |
|||
|
|||
# Better density plots |
|||
|
|||
data(geyser, package="MASS") |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
stat_bkde(bandwidth=0.25) |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
geom_bkde(bandwidth=0.25) |
|||
|
|||
``` |
|||
|
|||
### Test Results |
|||
|
|||
```{r} |
|||
library(ggalt) |
|||
library(testthat) |
|||
|
|||
date() |
|||
|
|||
test_dir("tests/") |
|||
``` |
|||
|
|||
### Code of Conduct |
|||
|
|||
Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md). |
|||
By participating in this project you agree to abide by its terms. |
@ -0,0 +1,162 @@ |
|||
<!-- README.md is generated from README.Rmd. Please edit that file --> |
|||
`ggalt` : Extra Geoms, Stats and Coords for `ggplot2` |
|||
|
|||
A package containing additional geoms, coords and stats for the revamped (late 2015) version of ggplot2. |
|||
|
|||
The first two forays into this brave, new `ggplot2` world are *splines*! and being able to use the (much better) `KernSmooth::bkde` for density plots. |
|||
|
|||
*NOTE* |
|||
|
|||
Until the new `ggplot2` version is on CRAN, you'll need to install it from github (see below). |
|||
|
|||
The following functions are implemented: |
|||
|
|||
- `geom_xspline` : Connect control points/observations with an X-spline |
|||
- `stat_xspline` : Connect control points/observations with an X-spline |
|||
- `geom_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) |
|||
- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) |
|||
|
|||
### News |
|||
|
|||
- Version 0.0.1.9000 released |
|||
|
|||
### Installation |
|||
|
|||
``` r |
|||
# you'll want to see the vignettes, trust me |
|||
devtools::install_github("hadley/ggplot2", build_vignettes=TRUE) |
|||
devtools::install_github("hrbrmstr/ggalt") |
|||
``` |
|||
|
|||
### Usage |
|||
|
|||
``` r |
|||
library(ggalt) |
|||
#> Loading required package: ggplot2 |
|||
|
|||
# current verison |
|||
packageVersion("ggalt") |
|||
#> [1] '0.0.1.9001' |
|||
|
|||
set.seed(1492) |
|||
dat <- data.frame(x=c(1:10, 1:10, 1:10), |
|||
y=c(sample(15:30, 10), 2*sample(15:30, 10), 3*sample(15:30, 10)), |
|||
group=factor(c(rep(1, 10), rep(2, 10), rep(3, 10))) |
|||
) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=group)) + |
|||
geom_point() + |
|||
geom_line() |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-1.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point() + |
|||
geom_line() + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-2.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-3.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-0.4, size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-4.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0.4, size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-5.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=1, size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-6.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0, size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-7.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-1, size=0.5) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-8.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
# Better density plots |
|||
|
|||
data(geyser, package="MASS") |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
stat_bkde(bandwidth=0.25) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-9.png" title="" alt="" width="672" /> |
|||
|
|||
``` r |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
geom_bkde(bandwidth=0.25) |
|||
``` |
|||
|
|||
<img src="README_figs/README-unnamed-chunk-4-10.png" title="" alt="" width="672" /> |
|||
|
|||
### Test Results |
|||
|
|||
``` r |
|||
library(ggalt) |
|||
library(testthat) |
|||
|
|||
date() |
|||
#> [1] "Tue Sep 8 16:16:44 2015" |
|||
|
|||
test_dir("tests/") |
|||
#> testthat results ======================================================================================================== |
|||
#> OK: 0 SKIPPED: 0 FAILED: 0 |
|||
#> |
|||
#> DONE |
|||
``` |
|||
|
|||
### Code of Conduct |
|||
|
|||
Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md). By participating in this project you agree to abide by its terms. |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 63 KiB |
@ -0,0 +1,25 @@ |
|||
Version: 1.0 |
|||
|
|||
RestoreWorkspace: No |
|||
SaveWorkspace: No |
|||
AlwaysSaveHistory: Default |
|||
|
|||
EnableCodeIndexing: Yes |
|||
Encoding: UTF-8 |
|||
|
|||
AutoAppendNewline: Yes |
|||
StripTrailingWhitespace: Yes |
|||
|
|||
BuildType: Package |
|||
PackageUseDevtools: Yes |
|||
PackageInstallArgs: --no-multiarch --with-keep.source |
|||
PackageRoxygenize: rd,collate,namespace |
|||
|
|||
UseSpacesForTab: Yes |
|||
NumSpacesForTab: 2 |
|||
|
|||
RnwWeave: Sweave |
|||
LaTeX: pdfLaTeX |
|||
|
|||
PackageBuildArgs: --resave-data |
|||
PackageCheckArgs: --as-cran |
@ -0,0 +1,114 @@ |
|||
% Generated by roxygen2 (4.1.1): do not edit by hand |
|||
% Please edit documentation in R/geom_bkde.r |
|||
\name{geom_bkde} |
|||
\alias{geom_bkde} |
|||
\alias{stat_bkde} |
|||
\title{Display a smooth density estimate.} |
|||
\usage{ |
|||
geom_bkde(mapping = NULL, data = NULL, stat = "bkde", |
|||
position = "identity", bandwidth, range.x = NULL, show.legend = NA, |
|||
inherit.aes = TRUE, ...) |
|||
|
|||
stat_bkde(mapping = NULL, data = NULL, geom = "area", |
|||
position = "stack", kernel = "normal", canonical = FALSE, bandwidth, |
|||
gridsize = 410, range.x = NULL, truncate = TRUE, 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), is combined with the default mapping at the top level of the |
|||
plot. You only need to supply \code{mapping} if there isn't a mapping |
|||
defined for the plot.} |
|||
|
|||
\item{data}{A data frame. If specified, overrides the default data frame |
|||
defined at the top level of the plot.} |
|||
|
|||
\item{position}{Position adjustment, either as a string, or the result of |
|||
a call to a position adjustment function.} |
|||
|
|||
\item{bandwidth}{the kernel bandwidth smoothing parameter. see |
|||
\code{\link[KernSmooth]{bkde}} for details} |
|||
|
|||
\item{range.x}{vector containing the minimum and maximum values of x at which |
|||
to compute the estimate. see \code{\link[KernSmooth]{bkde}} for details} |
|||
|
|||
\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}}.} |
|||
|
|||
\item{...}{other arguments passed on to \code{\link{layer}}. There are |
|||
three types of arguments you can use here: |
|||
|
|||
\itemize{ |
|||
\item Aesthetics: to set an aesthetic to a fixed value, like |
|||
\code{color = "red"} or \code{size = 3}. |
|||
\item Other arguments to the layer, for example you override the |
|||
default \code{stat} associated with the layer. |
|||
\item Other arguments passed on to the stat. |
|||
}} |
|||
|
|||
\item{geom,stat}{Use to override the default connection between |
|||
\code{geom_bkde} and \code{stat_bkde}.} |
|||
|
|||
\item{kernel}{character string which determines the smoothing kernel. see |
|||
\code{\link[KernSmooth]{bkde}} for details} |
|||
|
|||
\item{canonical}{logical flag: if TRUE, canonically scaled kernels are used. |
|||
see \code{\link[KernSmooth]{bkde}} for details} |
|||
|
|||
\item{gridsize}{the number of equally spaced points at which to estimate the |
|||
density. see \code{\link[KernSmooth]{bkde}} for details} |
|||
|
|||
\item{truncate}{logical flag: if TRUE, data with x values outside the range |
|||
specified by range.x are ignored. see \code{\link[KernSmooth]{bkde}} |
|||
for details} |
|||
} |
|||
\description{ |
|||
A kernel density estimate, useful for display the distribution of variables |
|||
with underlying smoothness. |
|||
} |
|||
\section{Aesthetics}{ |
|||
|
|||
\code{geom_bkde} understands the following aesthetics (required aesthetics |
|||
are in bold): |
|||
\itemize{ |
|||
\item \strong{\code{x}} |
|||
\item \strong{\code{y}} |
|||
\item \code{alpha} |
|||
\item \code{color} |
|||
\item \code{fill} |
|||
\item \code{linetype} |
|||
\item \code{size} |
|||
} |
|||
} |
|||
|
|||
\section{Computed variables}{ |
|||
|
|||
\describe{ |
|||
\item{density}{density estimate} |
|||
\item{count}{density * number of points - useful for stacked density |
|||
plots} |
|||
\item{scaled}{density estimate, scaled to maximum of 1} |
|||
} |
|||
} |
|||
\examples{ |
|||
data(geyser, package="MASS") |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
stat_bkde(bandwidth=0.25) |
|||
|
|||
ggplot(geyser, aes(x=duration)) + |
|||
geom_bkde(bandwidth=0.25) |
|||
} |
|||
\seealso{ |
|||
See \code{\link{geom_histogram}}, \code{\link{geom_freqpoly}} for |
|||
other methods of displaying continuous distribution. |
|||
See \code{\link{geom_violin}} for a compact density display. |
|||
} |
|||
|
@ -0,0 +1,174 @@ |
|||
% Generated by roxygen2 (4.1.1): do not edit by hand |
|||
% Please edit documentation in R/geom_xspline.r |
|||
\name{geom_xspline} |
|||
\alias{geom_xspline} |
|||
\alias{stat_xspline} |
|||
\title{Connect control points/observations with an X-spline} |
|||
\usage{ |
|||
geom_xspline(mapping = NULL, data = NULL, stat = "xspline", |
|||
position = "identity", show.legend = NA, inherit.aes = TRUE, |
|||
na.rm = TRUE, spline_shape = -0.25, open = TRUE, rep_ends = TRUE, ...) |
|||
|
|||
stat_xspline(mapping = NULL, data = NULL, geom = "line", |
|||
position = "identity", show.legend = NA, inherit.aes = TRUE, |
|||
spline_shape = -0.25, open = TRUE, rep_ends = 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), is combined with the default mapping at the top level of the |
|||
plot. You only need to supply \code{mapping} if there isn't a mapping |
|||
defined for the plot.} |
|||
|
|||
\item{data}{A data frame. If specified, overrides the default data frame |
|||
defined at the top level of the plot.} |
|||
|
|||
\item{position}{Position adjustment, either as a string, or the result of |
|||
a call to a position adjustment function.} |
|||
|
|||
\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}}.} |
|||
|
|||
\item{na.rm}{If \code{FALSE} (the default), removes missing values with |
|||
a warning. If \code{TRUE} silently removes missing values.} |
|||
|
|||
\item{spline_shape}{A numeric vector of values between -1 and 1, which |
|||
control the shape of the spline relative to the control points.} |
|||
|
|||
\item{open}{A logical value indicating whether the spline is an open or a |
|||
closed shape.} |
|||
|
|||
\item{rep_ends}{For open X-splines, a logical value indicating whether the |
|||
first and last control points should be replicated for drawing the |
|||
curve. Ignored for closed X-splines.} |
|||
|
|||
\item{...}{other arguments passed on to \code{\link{layer}}. There are |
|||
three types of arguments you can use here: |
|||
|
|||
\itemize{ |
|||
\item Aesthetics: to set an aesthetic to a fixed value, like |
|||
\code{color = "red"} or \code{size = 3}. |
|||
\item Other arguments to the layer, for example you override the |
|||
default \code{stat} associated with the layer. |
|||
\item Other arguments passed on to the stat. |
|||
}} |
|||
|
|||
\item{geom,stat}{Use to override the default connection between |
|||
\code{geom_xspline} and \code{stat_xspline}.} |
|||
} |
|||
\description{ |
|||
Draw an X-spline, a curve drawn relative to control points/observations. |
|||
Patterned after \code{geom_line} in that it orders the points by \code{x} |
|||
first before computing the splines. |
|||
} |
|||
\details{ |
|||
An X-spline is a line drawn relative to control points. For each control |
|||
point, the line may pass through (interpolate) the control point or it may |
|||
only approach (approximate) the control point; the behaviour is determined |
|||
by a shape parameter for each control point. |
|||
|
|||
If the shape parameter is greater than zero, the spline approximates the |
|||
control points (and is very similar to a cubic B-spline when the shape is |
|||
1). If the shape parameter is less than zero, the spline interpolates the |
|||
control points (and is very similar to a Catmull-Rom spline when the shape |
|||
is -1). If the shape parameter is 0, the spline forms a sharp corner at that |
|||
control point. |
|||
|
|||
For open X-splines, the start and end control points must have a shape of |
|||
0 (and non-zero values are silently converted to zero). |
|||
|
|||
For open X-splines, by default the start and end control points are |
|||
replicated before the curve is drawn. A curve is drawn between (interpolating |
|||
or approximating) the second and third of each set of four control points, |
|||
so this default behaviour ensures that the resulting curve starts at the |
|||
first control point you have specified and ends at the last control point. |
|||
The default behaviour can be turned off via the repEnds argument. |
|||
} |
|||
\section{Aesthetics}{ |
|||
|
|||
\code{geom_xspline} understands the following aesthetics (required aesthetics |
|||
are in bold): |
|||
\itemize{ |
|||
\item \strong{\code{x}} |
|||
\item \strong{\code{y}} |
|||
\item \code{alpha} |
|||
\item \code{color} |
|||
\item \code{linetype} |
|||
\item \code{size} |
|||
} |
|||
} |
|||
|
|||
\section{Computed variables}{ |
|||
|
|||
\itemize{ |
|||
\item{x} |
|||
\item{y} |
|||
} |
|||
} |
|||
\examples{ |
|||
set.seed(1492) |
|||
dat <- data.frame(x=c(1:10, 1:10, 1:10), |
|||
y=c(sample(15:30, 10), 2*sample(15:30, 10), |
|||
3*sample(15:30, 10)), |
|||
group=factor(c(rep(1, 10), rep(2, 10), rep(3, 10))) |
|||
) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=group)) + |
|||
geom_point() + |
|||
geom_line() |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point() + |
|||
geom_line() + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-0.4, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0.4, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=1, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=0, size=0.5) |
|||
|
|||
ggplot(dat, aes(x, y, group=group, color=factor(group))) + |
|||
geom_point(color="black") + |
|||
geom_smooth(se=FALSE, linetype="dashed", size=0.5) + |
|||
geom_xspline(spline_shape=-1, size=0.5) |
|||
} |
|||
\references{ |
|||
Blanc, C. and Schlick, C. (1995), "X-splines : A Spline Model |
|||
Designed for the End User", in \emph{Proceedings of SIGGRAPH 95}, |
|||
pp. 377-386. \url{http://dept-info.labri.fr/~schlick/DOC/sig1.html} |
|||
} |
|||
\seealso{ |
|||
\code{\link[ggplot2]{geom_line}}: Connect observations (x order); |
|||
\code{\link[ggplot2]{geom_path}}: Connect observations; |
|||
\code{\link[ggplot2]{geom_polygon}}: Filled paths (polygons); |
|||
\code{\link[ggplot2]{geom_segment}}: Line segments; |
|||
\code{\link[graphics]{xspline}}; |
|||
\code{\link[grid]{grid.xspline}} |
|||
} |
|||
|
@ -0,0 +1,14 @@ |
|||
% Generated by roxygen2 (4.1.1): do not edit by hand |
|||
% Please edit documentation in R/geom_bkde.r, R/geom_xspline.r |
|||
\docType{data} |
|||
\name{GeomBkde} |
|||
\alias{GeomBkde} |
|||
\alias{GeomXspline} |
|||
\alias{StatBkde} |
|||
\alias{StatXspline} |
|||
\title{GeomXspline} |
|||
\description{ |
|||
GeomXspline |
|||
} |
|||
\keyword{datasets} |
|||
|
@ -0,0 +1,15 @@ |
|||
% Generated by roxygen2 (4.1.1): do not edit by hand |
|||
% Please edit documentation in R/ggalt-package.r |
|||
\docType{package} |
|||
\name{ggalt} |
|||
\alias{ggalt} |
|||
\alias{ggalt-package} |
|||
\title{Extra Geoms, Stats and Coords for 'ggplot2'} |
|||
\description{ |
|||
A package containing additional geoms, coords and stats for the revamped (late 2015) version |
|||
of ggplot2. |
|||
} |
|||
\author{ |
|||
Bob Rudis (@hrbrmstr) |
|||
} |
|||
|
@ -0,0 +1,4 @@ |
|||
library(testthat) |
|||
library(ggalt) |
|||
|
|||
test_check("ggalt") |
@ -0,0 +1,6 @@ |
|||
context("basic functionality") |
|||
test_that("we can do something", { |
|||
|
|||
#expect_that(some_function(), is_a("data.frame")) |
|||
|
|||
}) |