boB Rudis
5 years ago
14 changed files with 383 additions and 19 deletions
@ -1,4 +1,6 @@ |
|||||
# Generated by roxygen2: do not edit by hand |
# Generated by roxygen2: do not edit by hand |
||||
|
|
||||
import(httr) |
export(StatLogspline) |
||||
importFrom(jsonlite,fromJSON) |
export(stat_logspline) |
||||
|
import(ggplot2) |
||||
|
import(logspline) |
||||
|
@ -1,12 +1,12 @@ |
|||||
#' ... |
#' A 'ggplot2' Extension for Visualizing Density, Distribution, Hazard, or Survival |
||||
#' |
#' Functions using the 'logspline' Package |
||||
#' - URL: <https://gitlab.com/hrbrmstr/gglogspline> |
#' |
||||
#' - BugReports: <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 |
||||
|
#' |
||||
#' @md |
#' @md |
||||
#' @name gglogspline |
#' @name gglogspline |
||||
#' @keywords internal |
#' @keywords internal |
||||
#' @author Bob Rudis (bob@@rud.is) |
#' @author Bob Rudis (bob@@rud.is) |
||||
#' @import httr |
#' @import ggplot2 logspline |
||||
#' @importFrom jsonlite fromJSON |
|
||||
"_PACKAGE" |
"_PACKAGE" |
||||
|
@ -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, |
||||
|
... |
||||
|
) |
||||
|
) |
||||
|
|
||||
|
} |
@ -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 |
# 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)) |
||||
|
``` |
||||
|
|
||||
|
<img src="README_files/figure-gfm/unnamed-chunk-1-1.png" width="672" /> |
||||
|
|
||||
|
``` r |
||||
|
|
||||
|
ggplot(xdf) + |
||||
|
stat_logspline(aes(val, y = stat(count))) + |
||||
|
labs(title = "logspline (count)") |
||||
|
``` |
||||
|
|
||||
|
<img src="README_files/figure-gfm/unnamed-chunk-1-2.png" width="672" /> |
||||
|
|
||||
|
``` r |
||||
|
|
||||
|
ggplot(xdf) + |
||||
|
stat_logspline(aes(val, y = stat(probs))) + |
||||
|
labs(title = "logspline (probability function)") |
||||
|
``` |
||||
|
|
||||
|
<img src="README_files/figure-gfm/unnamed-chunk-1-3.png" width="672" /> |
||||
|
|
||||
|
``` r |
||||
|
|
||||
|
ggplot(xdf) + |
||||
|
stat_logspline(aes(val, y = stat(survival))) + |
||||
|
labs(title = "logspline (survival function)") |
||||
|
``` |
||||
|
|
||||
|
<img src="README_files/figure-gfm/unnamed-chunk-1-4.png" width="672" /> |
||||
|
|
||||
|
``` r |
||||
|
|
||||
|
ggplot(xdf) + |
||||
|
stat_logspline(aes(val, y = stat(hazard))) + |
||||
|
labs(title = "logspline (hazard function)") |
||||
|
``` |
||||
|
|
||||
|
<img src="README_files/figure-gfm/unnamed-chunk-1-5.png" width="672" /> |
||||
|
|
||||
|
## 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. |
||||
|
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 54 KiB |
@ -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} |
@ -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)) |
||||
|
} |
Loading…
Reference in new issue