【问题标题】:How to build a crossword-like plot for a boolean matrix如何为布尔矩阵构建类似填字游戏的图
【发布时间】:2015-01-20 00:21:46
【问题描述】:

我有一个布尔矩阵:

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

对于这个矩阵,我想制作一个类似于这个的图:

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

也许我遗漏了一些明显的东西,但我没有看到如何在 R 中做到这一点的简单方法。到目前为止,我最好的尝试是基于 barplot:

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

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

欢迎提出意见

【问题讨论】:

标签: r


【解决方案1】:

您可以使用 ggplot2 的 geom_tile 和 reshape2 的 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")

最终输出:

【讨论】:

    【解决方案2】:

    这里还有一些完善图形选项的方法。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      这是一种使用qheat 包装qdap 包中的ggplot2 的方法:

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

      【讨论】:

        【解决方案4】:

        这是使用graphics 包中的plot 的方法:

        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)
        

        【讨论】:

        • pch 的使用很有趣,但请注意cex 必须根据绘图设备的大小进行调整。
        猜你喜欢
        • 2022-01-12
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        相关资源
        最近更新 更多