如何为布尔矩阵构建类似填字游戏的图

时间:2015-01-20 00:21:47

标签: r

我有一个布尔矩阵:

mm <- structure(c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, 
                  FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, 
                  FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, 
                  FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, 
                  FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, 
                  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                  TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                  TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                  TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                  TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, 
                  TRUE, TRUE, TRUE), .Dim = c(10L, 10L), .Dimnames = list(NULL, 
                                                                          c("n1", "n2", "n3", "n4", "n5", "n1.1", "n2.1", "n3.1", "n4.1", 
                                                                            "n5.1")))

对于这个矩阵,我想制作一个与此类似的情节:

crossword-like plot

(图片来自Matlab的类似问题:How can I display a 2D binary matrix as a black & white plot?

也许我错过了一些明显的东西,但我在R中看不到如何做到这一点的简单方法。到目前为止,我最好的尝试是基于条形图:

m1 <- matrix(TRUE,ncol=10,nrow=10)
barplot(m1,col=mm)

但它会使所有行具有相同的颜色。

欢迎任何想法

4 个答案:

答案 0 :(得分:6)

你可以使用ggplot2&#39; s geom_tile和reshape2&#39; s melt执行此操作:

library(ggplot2)
library(reshape2)

melted <- melt(mm)
ggplot(melted, aes(x = Var2, y = Var1, fill = value)) + geom_tile() +
    scale_fill_manual(values = c("white", "black"))

为了使它更整洁,您可以通过对主题进行一些调整来删除图例和灰色边缘:

ggplot(melted, aes(x = Var2, y = Var1, fill = value)) + geom_tile() +
    scale_fill_manual(values = c("white", "black")) +
    theme_bw() +
    theme(legend.position = "none")

最终输出:

enter image description here

答案 1 :(得分:5)

以下是 qdap 包中使用qheat ggplot2 包装的方法:

library(qdap)
qheat(t(data.frame(mm)), by.column=NULL, high="black", text.color =NA,
    grid="grey20") + guides(fill=FALSE)

enter image description here

答案 2 :(得分:5)

以下是一些完善图形选项的方法。

  1. rect基础图形:

    plot.new()
    par(mar=rep(0, 4))
    plot.window(xlim=c(0, ncol(mm)), ylim=c(0, nrow(mm)), asp=1)
    o <- cbind(c(row(mm)), c(col(mm))) - 1
    rect(o[, 1], o[, 2], o[, 1] + 1, o[, 2] + 1, col=t(mm)[, ncol(mm):1])
    

    enter image description here

  2. lattice::levelplotlatticeExtra

    library(latticeExtra)
    levelplot(t(mm)[, ncol(mm):1], asp=1, scales='sliced', 
              col.regions=c('white', 'black'), margin=FALSE, colorkey=FALSE) + 
      layer(panel.grid(h=nrow(mm)-1, v=ncol(mm)-1, col=1))
    

    enter image description here

  3. rasterVis::levelplotrasterlatticeExtra

    library(rasterVis)
    library(latticeExtra)
    levelplot(raster(mm), col.regions=c('white', 'black'), 
              margin=FALSE, colorkey=FALSE) + 
      layer(panel.grid(h=nrow(mm)-1, v=ncol(mm)-1, col=1))
    

    enter image description here

  4. sp::spplotrasterlatticeExtra

    library(raster)
    library(latticeExtra)
    spplot(raster(mm), colorkey=FALSE, col.regions=c('white', 'black')) +
      layer(panel.grid(h=nrow(mm)-1, v=ncol(mm)-1, col=1))
    

    enter image description here

  5. raster

    设置图形设备的尺寸可能有点繁琐,以致raster不会在预期的x和y限制之外绘制其他(部分)单元格。使用此方法时,如果目标是导出到例如png,我首先绘制到windows / x11 / quartz并调整窗口大小,直到绘制区域符合我的预期,然后使用dev.size()查询设备尺寸,使用这些值来确定绘制到png的尺寸比率。

    plot(raster(mm), legend=FALSE, col=c('white', 'black'))
    abline(h=seq(0, 1, len=nrow(mm) + 1), 
           v=seq(0, 1, len=ncol(mm) + 1))
    

    enter image description here

答案 3 :(得分:4)

以下是使用plot包中的graphics的方法:

plot(rep(1:10, each = 10), rep(-(1:10), 10), axes = FALSE, ann = FALSE,
     pch = ifelse(mm, 0, 15), cex = 6, asp = 1, xpd = NA)

enter image description here