13829 # How to plot a mosaicplot for a 1x1 contingency table?

<h3>Question</h3>

Plotting a 1-by-1 contingency table returns an error:

```dat <- read.table(textConnection(' foo bar TRUE TRUE TRUE TRUE '), header = TRUE, colClasses=c('logical', 'logical')) mosaicplot(table(dat)) Error in rep.int(0, ydim) : invalid 'times' value ```

As I learned, the code in the mosaicplot function doesn't allow to plot a 1-by-1-table. But then, how <em>do</em> I plot a mosaicplot of that table?

<hr />

<em>Background.</em>

I am plotting a series of dynamically created tables, some of which sometimes happen to have only one column and one row, at other times they have more dimensions. Having an undivided rectangle in that series of mosaicplots is valuable information and easily grasped in that visual representation.

One possibility is to coerce the variables to be plotted to `factor` and specify the possible outcomes in `levels` (in the desired order). Then zero count cells will be represented as thin lines.

```dat[] = lapply(dat, factor, levels = c(TRUE, FALSE)) mosaicplot(table(dat)) ```

If you don't want the thin lines of <em>@Henrik</em>'s (<em>great!</em>) solution you could substitute one-dimensional cases with a custom plot function.

```mpOneDim <- function(tbl, title="table(dat)") { dn <- attr(tbl, "dimnames") labs <- names(dn) levels <- unlist(dn) plot.new() rect(0.0125, -.035, .985, .99, col="gray", border=1) mtext(title, line=1.55, font=2, cex=1.2) mtext(labs, 1, 1) mtext(labs, 2, 1) mtext(levels, 2, -1.15, cex=.7) mtext(levels, 3, -.75, cex=.7) } mpOneDim(table(dat)) ```

In your function do something like this:

```if (sum(dim(table(dat))) <= 2) { mpOneDim(table(dat)) } else { mosaicplot(table(dat)) } ``` <hr />

<em>Data:</em>

```dat <- structure(list(foo = c(TRUE, TRUE), bar = c(TRUE, TRUE)), class = "data.frame", row.names = c(NA, -2L)) ```