【问题标题】:How to plot a mosaicplot for a 1x1 contingency table?如何为 1x1 列联表绘制马赛克图?
【发布时间】:2020-09-26 07:52:27
【问题描述】:

绘制 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

As I learned,mosaicplot 函数中的代码不允许绘制 1×1 表。但是,如何绘制该表的马赛克图?


背景。

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

【问题讨论】:

    标签: r plot mosaic-plot


    【解决方案1】:

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

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

    【讨论】:

    • 对于第二种解决方案(强制因子),删除瓷砖之间的间距会产生几乎漂亮的情节:mosaicplot(table(dat), off = 0)
    【解决方案2】:

    如果您不想要 @Henrik 的 (great!) 解决方案的细线,您可以使用自定义绘图函数替换一维案例。

    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))
    

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多