@ -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) |
@ -1,12 +1,12 @@ | |||
#' ... | |||
#' | |||
#' - URL: <https://gitlab.com/hrbrmstr/gglogspline> | |||
#' - BugReports: <https://gitlab.com/hrbrmstr/gglogspline/issues> | |||
#' | |||
#' 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" |
@ -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 @@ | |||
[](https://travis-ci.org/hrbrmstr/gglogspline) | |||
[](https://codecov.io/gh/hrbrmstr/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)) | |||
``` | |||
<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. |
@ -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)) | |||
} |