diff --git a/DESCRIPTION b/DESCRIPTION index a81d62e..0d23a44 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,7 @@ Package: gglogspline Type: Package -Title: gglogspline title goes here otherwise CRAN checks fail +Title: A 'ggplot2' Extension for Visualizing Density, Distribution, Hazard, or Survival + Functions using the 'logspline' Package Version: 0.1.0 Date: 2019-06-17 Authors@R: c( @@ -8,7 +9,8 @@ Authors@R: c( comment = c(ORCID = "0000-0001-5670-2640")) ) Maintainer: Bob Rudis -Description: A good description goes here otherwise CRAN checks fail. +Description: Methods are provided to plot a logspline density, distribution function, + hazard function or survival function from a logspline density. URL: https://gitlab.com/hrbrmstr/gglogspline BugReports: https://gitlab.com/hrbrmstr/gglogspline/issues Encoding: UTF-8 @@ -19,7 +21,7 @@ Suggests: Depends: R (>= 3.2.0) Imports: - httr, - jsonlite + ggplot2, + logspline Roxygen: list(markdown = TRUE) RoxygenNote: 6.1.1 diff --git a/NAMESPACE b/NAMESPACE index 5b4b9ae..0967224 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,6 @@ # Generated by roxygen2: do not edit by hand -import(httr) -importFrom(jsonlite,fromJSON) +export(StatLogspline) +export(stat_logspline) +import(ggplot2) +import(logspline) diff --git a/R/gglogspline-package.R b/R/gglogspline-package.R index 3669acc..058764f 100644 --- a/R/gglogspline-package.R +++ b/R/gglogspline-package.R @@ -1,12 +1,12 @@ -#' ... -#' -#' - URL: -#' - BugReports: -#' +#' A 'ggplot2' Extension for Visualizing Density, Distribution, Hazard, or Survival +#' Functions using the 'logspline' Package +#' +#' Methods are provided to plot a logspline density, distribution function, +#' hazard function or survival function from a logspline density +#' #' @md #' @name gglogspline #' @keywords internal #' @author Bob Rudis (bob@@rud.is) -#' @import httr -#' @importFrom jsonlite fromJSON +#' @import ggplot2 logspline "_PACKAGE" diff --git a/R/stat-logspline.R b/R/stat-logspline.R new file mode 100644 index 0000000..7087ce2 --- /dev/null +++ b/R/stat-logspline.R @@ -0,0 +1,116 @@ +#' Base ggproto classes for gglogspline +#' +#' @section Computed variables: +#' +#' - `density` : the density estimate +#' - `count`: computed counts (similar to [ggplots::stat_density()]) +#' - `probs`: distribution function +#' - `survival`: survival function +#' - `hazard` : hazard function +#' +#' By default the `y` aesthetic is mapped to `stat(density)` +#' +#' @rdname gglogspline-ggproto +#' @export +StatLogspline <- ggproto( + + "StatLogspline", Stat, + + compute_group = function(data, scales, + n = 100, max_knots = 0, n_knots = 0, + min_d = -1, error_action = 2) { + + logspline( + data$x, + maxknots = max_knots, + nknots = n_knots, + mind = min_d, + error.action = error_action + ) -> lsp + + # computed upper and lower bounds for simplicity + + u1 <- qlogspline(0.01, lsp) + u2 <- qlogspline(0.99, lsp) + + # we need these to compute the new x-axis values + + u3 <- 1.1 * u1 - 0.1 * u2 + u4 <- 1.1 * u2 - 0.1 * u1 + + # compute the new X-axis values and the log-density + + xx <- (0:(n - 1))/(n - 1) * (u4 - u3) + u3 + den <- dlogspline(xx, lsp) + prb <- plogspline(xx, lsp) + + # our new data frame with an extra computed stat for the count + + data.frame( + x = xx, + density = den, + probs = prb, + survival = 1 - prb, + hazard = den / (1 - prb), + count = den * nrow(data), + stringsAsFactors = FALSE + ) + + }, + + required_aes = c("x"), # we only accept one parameter + + default_aes = aes( + y = stat(density) # by default we use the computed stat + ) + +) + +#' Computes and draws... +#' +#' @inheritParams ggplot2::stat_density +#' @param n numbe of points for the density estimation (larger == smoother) +#' @param max_knots the maximum number of knots. The routine stops adding knots when +#' this number of knots is reached. The method has an automatic rule for selecting +#' maxknots if this parameter is not specified. +#' @param n_knots forces the method to start with nknots knots. The method has an automatic +#' rule for selecting nknots if this parameter is not specified. +#' @param min_d minimum distance, in order statistics, between knots. +#' @param error_action see `error.action` in [logspline::plot.logspline()] +#' @export +#' @examples +#' library(ggplot2) +#' +#' set.seed(1) +#' data.frame( +#' val = rnorm(100) +#' ) -> xdf +#' +#' ggplot(xdf) + stat_logspline(aes(val)) +stat_logspline <- function(mapping = NULL, data = NULL, geom = "area", + position = "identity", na.rm = FALSE, show.legend = NA, + inherit.aes = TRUE, + # our custom params + n = 100, max_knots = 0, n_knots = 0, min_d = -1, error_action = 2, + ...) { + + layer( + stat = StatLogspline, + data = data, + mapping = mapping, + geom = geom, + position = position, + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list( + na.rm = na.rm, + # pass on our fancy custom params + n = n, + max_knots = max_knots, + n_knots = n_knots, + error_action = error_action, + ... + ) + ) + +} \ No newline at end of file diff --git a/README.Rmd b/README.Rmd index 6192bd7..c0ce56f 100644 --- a/README.Rmd +++ b/README.Rmd @@ -4,7 +4,7 @@ editor_options: chunk_output_type: inline --- ```{r pkg-knitr-opts, include=FALSE} -knitr:: sopts_chunk$set( +knitr::opts_chunk$set( collapse = TRUE, fig.retina = 2, message = FALSE, warning = FALSE ) options(width=120) @@ -16,8 +16,12 @@ options(width=120) # gglogspline +A 'ggplot2' Extension for Visualizing Density, Distribution, Hazard, or Survival Functions using the 'logspline' Package + ## Description +Methods are provided to plot a logspline density, distribution function, hazard function or survival function from a logspline density + ## What's Inside The Tin The following functions are implemented: @@ -40,12 +44,39 @@ devtools::install_github("hrbrmstr/gglogspline") ```{r lib-ex} library(gglogspline) +library(ggplot2) # current version packageVersion("gglogspline") ``` +```{r} +set.seed(1) +data.frame( + val = rnorm(100) +) -> xdf + +ggplot(xdf) + + stat_logspline(aes(val)) + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(count))) + + labs(title = "logspline (count)") + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(probs))) + + labs(title = "logspline (probability function)") + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(survival))) + + labs(title = "logspline (survival function)") + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(hazard))) + + labs(title = "logspline (hazard function)") +``` + ## gglogspline Metrics ```{r cloc, echo=FALSE} diff --git a/README.md b/README.md index 0497532..8e86627 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,106 @@ + +[![Travis-CI Build +Status](https://travis-ci.org/hrbrmstr/gglogspline.svg?branch=master)](https://travis-ci.org/hrbrmstr/gglogspline) +[![Coverage +Status](https://codecov.io/gh/hrbrmstr/gglogspline/branch/master/graph/badge.svg)](https://codecov.io/gh/hrbrmstr/gglogspline) +[![CRAN\_Status\_Badge](https://www.r-pkg.org/badges/version/gglogspline)](https://cran.r-project.org/package=gglogspline) + # gglogspline +A ‘ggplot2’ Extension for Visualizing Density, Distribution, Hazard, or +Survival Functions using the ‘logspline’ Package + +## Description + +Methods are provided to plot a logspline density, distribution function, +hazard function or survival function from a logspline density + +## What’s Inside The Tin + +The following functions are implemented: + +## Installation + +``` r +devtools::install_git("https://git.sr.ht/~hrbrmstr/gglogspline.git") +# or +devtools::install_git("https://git.rud.is/hrbrmstr/gglogspline.git") +# or +devtools::install_gitlab("hrbrmstr/gglogspline") +# or +devtools::install_bitbucket("hrbrmstr/gglogspline") +# or +devtools::install_github("hrbrmstr/gglogspline") +``` + +## Usage + +``` r +library(gglogspline) +library(ggplot2) + +# current version +packageVersion("gglogspline") +## [1] '0.1.0' +``` + +``` r +set.seed(1) +data.frame( + val = rnorm(100) +) -> xdf + +ggplot(xdf) + + stat_logspline(aes(val)) +``` + + + +``` r + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(count))) + + labs(title = "logspline (count)") +``` + + + +``` r + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(probs))) + + labs(title = "logspline (probability function)") +``` + + + +``` r + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(survival))) + + labs(title = "logspline (survival function)") +``` + + + +``` r + +ggplot(xdf) + + stat_logspline(aes(val, y = stat(hazard))) + + labs(title = "logspline (hazard function)") +``` + + + +## gglogspline Metrics + +| Lang | \# Files | (%) | LoC | (%) | Blank lines | (%) | \# Lines | (%) | +| :--- | -------: | --: | --: | ---: | ----------: | ---: | -------: | --: | +| R | 4 | 0.8 | 63 | 0.67 | 20 | 0.47 | 53 | 0.6 | +| Rmd | 1 | 0.2 | 31 | 0.33 | 23 | 0.53 | 35 | 0.4 | + +## 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. diff --git a/README_files/figure-gfm/unnamed-chunk-1-1.png b/README_files/figure-gfm/unnamed-chunk-1-1.png new file mode 100644 index 0000000..d3e59e9 Binary files /dev/null and b/README_files/figure-gfm/unnamed-chunk-1-1.png differ diff --git a/README_files/figure-gfm/unnamed-chunk-1-2.png b/README_files/figure-gfm/unnamed-chunk-1-2.png new file mode 100644 index 0000000..4bca005 Binary files /dev/null and b/README_files/figure-gfm/unnamed-chunk-1-2.png differ diff --git a/README_files/figure-gfm/unnamed-chunk-1-3.png b/README_files/figure-gfm/unnamed-chunk-1-3.png new file mode 100644 index 0000000..a4e2ab6 Binary files /dev/null and b/README_files/figure-gfm/unnamed-chunk-1-3.png differ diff --git a/README_files/figure-gfm/unnamed-chunk-1-4.png b/README_files/figure-gfm/unnamed-chunk-1-4.png new file mode 100644 index 0000000..5b0453d Binary files /dev/null and b/README_files/figure-gfm/unnamed-chunk-1-4.png differ diff --git a/README_files/figure-gfm/unnamed-chunk-1-5.png b/README_files/figure-gfm/unnamed-chunk-1-5.png new file mode 100644 index 0000000..5504281 Binary files /dev/null and b/README_files/figure-gfm/unnamed-chunk-1-5.png differ diff --git a/man/gglogspline-ggproto.Rd b/man/gglogspline-ggproto.Rd new file mode 100644 index 0000000..563c0eb --- /dev/null +++ b/man/gglogspline-ggproto.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stat-logspline.R +\docType{data} +\name{StatLogspline} +\alias{StatLogspline} +\title{Base ggproto classes for gglogspline} +\format{An object of class \code{StatLogspline} (inherits from \code{Stat}, \code{ggproto}, \code{gg}) of length 4.} +\usage{ +StatLogspline +} +\description{ +Base ggproto classes for gglogspline +} +\section{Computed variables}{ + +\itemize{ +\item \code{density} : the density estimate +\item \code{count}: computed counts (similar to \code{\link[ggplots:stat_density]{ggplots::stat_density()}}) +\item \code{probs}: distribution function +\item \code{survival}: survival function +\item \code{hazard} : hazard function +} + +By default the \code{y} aesthetic is mapped to \code{stat(density)} +} + +\keyword{datasets} diff --git a/man/gglogspline.Rd b/man/gglogspline.Rd index eaabf65..4c281fc 100644 --- a/man/gglogspline.Rd +++ b/man/gglogspline.Rd @@ -4,12 +4,11 @@ \name{gglogspline} \alias{gglogspline} \alias{gglogspline-package} -\title{...} +\title{A 'ggplot2' Extension for Visualizing Density, Distribution, Hazard, or Survival +Functions using the 'logspline' Package} \description{ -\itemize{ -\item URL: \url{https://gitlab.com/hrbrmstr/gglogspline} -\item BugReports: \url{https://gitlab.com/hrbrmstr/gglogspline/issues} -} +Methods are provided to plot a logspline density, distribution function, +hazard function or survival function from a logspline density } \seealso{ Useful links: diff --git a/man/stat_logspline.Rd b/man/stat_logspline.Rd new file mode 100644 index 0000000..c238112 --- /dev/null +++ b/man/stat_logspline.Rd @@ -0,0 +1,83 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/stat-logspline.R +\name{stat_logspline} +\alias{stat_logspline} +\title{Computes and draws...} +\usage{ +stat_logspline(mapping = NULL, data = NULL, geom = "area", + position = "identity", na.rm = FALSE, show.legend = NA, + inherit.aes = TRUE, n = 100, max_knots = 0, n_knots = 0, + min_d = -1, error_action = 2, ...) +} +\arguments{ +\item{mapping}{Set of aesthetic mappings created by \code{\link[=aes]{aes()}} or +\code{\link[=aes_]{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]{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]{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. A \code{function} can be created +from a \code{formula} (e.g. \code{~ head(.x, 10)}).} + +\item{geom}{Use to override the default connection between +\code{geom_density} and \code{stat_density}.} + +\item{position}{Position adjustment, either as a string, or the result of +a call to a position adjustment function.} + +\item{na.rm}{If \code{FALSE}, the default, missing values are removed with +a warning. If \code{TRUE}, missing values are silently removed.} + +\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. +It can also be a named logical vector to finely select the aesthetics to +display.} + +\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]{borders()}}.} + +\item{n}{numbe of points for the density estimation (larger == smoother)} + +\item{max_knots}{the maximum number of knots. The routine stops adding knots when +this number of knots is reached. The method has an automatic rule for selecting +maxknots if this parameter is not specified.} + +\item{n_knots}{forces the method to start with nknots knots. The method has an automatic +rule for selecting nknots if this parameter is not specified.} + +\item{min_d}{minimum distance, in order statistics, between knots.} + +\item{error_action}{see \code{error.action} in \code{\link[logspline:plot.logspline]{logspline::plot.logspline()}}} + +\item{...}{Other arguments passed on to \code{\link[=layer]{layer()}}. These are +often aesthetics, used to set an aesthetic to a fixed value, like +\code{colour = "red"} or \code{size = 3}. They may also be parameters +to the paired geom/stat.} +} +\description{ +Computes and draws... +} +\examples{ +library(ggplot2) + +set.seed(1) +data.frame( + val = rnorm(100) +) -> xdf + +ggplot(xdf) + stat_logspline(aes(val)) +}