apexcharter/R/spark-box.R

117 lines
3.8 KiB
R

#' Create a box with a sparkline
#'
#' @param data A \code{data.frame}-like object with at least two columns,
#' first is mapped to x-axis, second to y-axis.
#' @param title Title to display in the box.
#' @param subtitle Subtitle to display in the box.
#' @param color Color of the chart.
#' @param background Background color of the box.
#' @param type Type of chart, currently type supported are :
#' \code{"area"} (default), \code{"line"}, \code{"spline"}, \code{"column"}.
#' @param synchronize Give a common id to charts to synchronize them (tooltip and zoom).
#' @param title_style,subtitle_style A \code{list} of named attributes to style
#' the title / subtitle, possible values are \code{fontSize},
#' \code{fontWeight}, \code{fontFamily}, \code{color}.
#' @param width,height A numeric input in pixels.
#' @param elementId Use an explicit element ID for the widget.
#'
#' @return An \code{apexcharts} \code{htmlwidget} object.
#' @export
#'
#' @note In Shiny use \code{sparkBoxOutput} / \code{renderSparkBox} to render boxes, see example.
#' Boxes have CSS class \code{"apexcharter-spark-box"} if you need more styling.
#'
#' @importFrom htmlwidgets sizingPolicy
#' @importFrom rlang sym
#' @importFrom ggplot2 aes
#'
#' @example examples/spark_box.R
spark_box <- function(data,
title = NULL,
subtitle = NULL,
color = "#2E93fA",
background = "#FFF",
type = c("area", "line", "spline", "column"),
synchronize = NULL,
title_style = NULL,
subtitle_style = NULL,
width = NULL,
height = NULL,
elementId = NULL) {
type <- match.arg(type)
data <- as.data.frame(data)
if (ncol(data) < 2)
stop("'data' must have at least two columns!", call. = FALSE)
x_var <- names(data)[1]
y_var <- names(data)[2]
spark <- apex(
data = data,
aes(x = !!sym(x_var), y = !!sym(y_var)),
type = type,
auto_update = config_update(update_options = TRUE)
)
spark <- ax_chart(
ax = spark,
sparkline = list(enabled = TRUE),
group = synchronize
)
spark <- ax_yaxis(spark, show = FALSE)
spark <- ax_colors(spark, color)
if (!is.null(title)) {
if (is.null(title_style))
title_style <- list(fontSize = "24px")
if (is.null(title_style$fontSize))
title_style$fontSize <- "24px"
spark <- ax_title(
ax = spark,
text = title,
style = title_style
)
}
if (!is.null(subtitle)) {
if (is.null(subtitle_style))
subtitle_style <- list(fontSize = "14px")
if (is.null(subtitle_style$fontSize))
subtitle_style$fontSize <- "14px"
spark <- ax_subtitle(
ax = spark,
text = subtitle,
style = subtitle_style
)
}
spark$x$sparkbox <- list(
color = color, background = background
)
spark$sizingPolicy <- htmlwidgets::sizingPolicy(
defaultWidth = "100%",
defaultHeight = "160px",
viewer.defaultHeight = "160px",
viewer.defaultWidth = "100%",
viewer.fill = FALSE,
knitr.figure = FALSE,
knitr.defaultWidth = "100%",
knitr.defaultHeight = "160px",
browser.fill = FALSE,
viewer.suppress = FALSE,
browser.external = TRUE,
padding = 15
)
return(spark)
}
#' @rdname apexcharter-shiny
#' @export
sparkBoxOutput <- function(outputId, width = "100%", height = "160px") { # nocov start
htmlwidgets::shinyWidgetOutput(outputId, "apexcharter", width, height, package = "apexcharter")
} # nocov end
#' @rdname apexcharter-shiny
#' @export
renderSparkBox <- function(expr, env = parent.frame(), quoted = FALSE) { # nocov start
if (!quoted) { expr <- substitute(expr) } # force quoted
htmlwidgets::shinyRenderWidget(expr, apexchartOutput, env, quoted = TRUE)
} # nocov end