Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Generated by roxygen2: do not edit by hand

S3method(tinyplot,data.frame)
S3method(tinyplot,default)
S3method(tinyplot,density)
S3method(tinyplot,formula)
Expand Down Expand Up @@ -129,6 +130,7 @@ importFrom(stats,qchisq)
importFrom(stats,qnorm)
importFrom(stats,qt)
importFrom(stats,quantile)
importFrom(stats,reformulate)
importFrom(stats,setNames)
importFrom(stats,spline)
importFrom(stats,terms)
Expand Down
89 changes: 89 additions & 0 deletions R/tinyplot.data.frame.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#' tinyplot Method for Plotting Data Frames
#'
#' @description Convenience interface for visualizing data.frame objects
#' with tinyplot.
#'
#' @details This is a convenience function for plotting data frames with
#' or without a formula. The case with the formula mainly facilitates
#' using `tinyplot()` in combination with pipes. The case without
#' formula provides a quick way of plotting the variables in data frames,
#' either only one variable or a pair of variables, or all possible pairs
#' of variables.
#'
#' @param x an object of class `"data.frame"`.
#' @param formula a \code{\link[stats]{formula}} that is passed on to
#' \code{\link{tinyplot.formula}}. If `formula` is `NULL` a formula of
#' type `y ~ 1` or `y ~ x` is set up for 1- and 2-dimensional data frames,
#' respectively. For data frames with more than 2 variables the `facet = NULL`
#' case is not supported, yet, and currently leads to an error.
#' @param ... further arguments passed to `tinyplot`.
#'
#' @examples
#' tinytheme("clean2")
#'
#' ## using tinyplot() with data frames
#' tinyplot(cars)
#' tinyplot(iris, Sepal.Length ~ Petal.Width | Species)
#'
#' ## note that this also enables usage with pipes (in R >= 4.1.0) such as
#' ## cars |> tinyplot()
#' ## iris |> tinyplot(Sepal.Length ~ Petal.Width | Species)
#'
#' ## pairs-style display for more than 2 variables
#' ## (handling of axes and their labels will be improved in future versions)
#' tinyplot(iris)
#'
#' tinytheme() ## reset
Comment thread
zeileis marked this conversation as resolved.
#'
#' @importFrom stats reformulate
#' @export
tinyplot.data.frame = function (x, formula = NULL, ...) {
## original call
cl = match.call()

## update call for formula interface
names(cl)[names(cl) == "x"] = "data"
cl[[1L]] = quote(tinyplot::tinyplot)
if (is.null(formula)) cl$formula = . ~ .
id = which(names(cl) == "formula")
cl = as.call(as.list(cl)[c(1L, id, setdiff(2L:length(cl), id))])

## variables
nm = names(x)
n = length(nm)

if (is.null(formula) & n > 2L) {

## 3d: pairs-esque
op = par(mfrow = c(n, n))
for (j in 1L:n) {
for (i in 1L:n) {
cl_ij = cl
if (i == j) {
cl_ij$formula = reformulate("1", nm[i])
cl_ij$xlab = ""
cl_ij$ylab = ""
cl_ij$main = nm[i]
} else {
cl_ij$formula = reformulate(nm[i], nm[j])
if (i > 1L) cl_ij$ylab = ""
if (j < n) cl_ij$xlab = ""
}
eval.parent(cl_ij)
}
}
par(op)

} else {

## default formula
## 1d: y ~ 1
## 2d: y ~ x
if (is.null(formula)) {
cl$formula = if (length(nm) < 2L) reformulate("1", nm) else reformulate(nm[1L], nm[2L])
}

## evaluate updated call
eval.parent(cl)
}
}
49 changes: 49 additions & 0 deletions man/tinyplot.data.frame.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading