如何为 1x1 意外事件 table 绘制马赛克图?

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

绘制 1×1 意外事故 table returns 一个错误:

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

,mosaicplot 函数中的代码不允许绘制 1×1-table。但是,如何我绘制了那个table的马赛克图?


背景。

我正在绘制一系列动态创建的 table,其中一些有时恰好只有一列和一行,有时它们有更多维度。在该系列马赛克图中有一个未分割的矩形是有价值的信息,并且在该视觉表示中很容易掌握。

一种可能性是将要绘制的变量强制设置为 factor 并在 levels 中指定可能的结果(按所需顺序)。然后零计数细胞将被表示为细线。

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

如果您不想要 @Henrik 的(太棒了!)解决方案的细线,您可以用一维替代具有自定义绘图功能的案例。

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, 1)
  mtext(labs[2], 2, 1)
  mtext(levels[2], 2, -1.15, cex=.7)
  mtext(levels[2], 3, -.75, cex=.7)
}
mpOneDim(table(dat))

在你的函数中做这样的事情:

if (sum(dim(table(dat))) <= 2) {
  mpOneDim(table(dat))
} else {
  mosaicplot(table(dat))
}

数据:

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