2

绘制 1×1 列联表会返回错误:

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 表。但是,如何绘制该表的马赛克图?


背景。

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

4

2 回答 2

3

一种可能性是强制要绘制的变量factor并指定可能的结果levels(以所需的顺序)。然后零计数单元将表示为细线。

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

在此处输入图像描述

于 2020-06-07T10:14:15.480 回答
0

如果您不想要@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))
于 2020-06-07T10:31:23.197 回答