2015-01-20 3 views
5

У меня есть булева матрица:Как построить кроссворд подобного участка для булевой матрицы

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

Может быть, я что-то очевидное отсутствует, но я не вижу простой способ, как d о том, что в R. До сих пор моя лучшая попытка основана на barplot:

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

, но он делает все строки имеют одни и те же цвета.

Любые идеи приветствуются

+1

Я бы порекомендовал посмотреть на 'plotrix :: color2D.matplot' –

+1

http://stackoverflow.com/questions/21316363/plot-and-fill-chessboard-like -area-and-the-similars-in-r – Khashaa

ответ

5

Вы можете сделать это с помощью 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") 

Окончательный вывод:

enter image description here

5

Вот такой подход, который использует qheat обертка для ggplot2 из qdap пакет:

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

Вот подход, использующий 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

+0

Интересное использование 'pch', но обратите внимание, что' cex' нужно будет скорректировать в соответствии с размером устройства построения. – jbaums

3

Вот еще несколько подходов к округлению вариантов графики.

  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::levelplot и latticeExtra:

    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::levelplot, raster и latticeExtra:

    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::spplot, raster и latticeExtra:

    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 не построить дополнительные (частичные) клетки вне предназначенного й и у пределов. При использовании этого подхода, если целью является экспорт в, например, png, я нарисую до windows/x11//и измените размер окна до тех пор, пока область не будет такой, как я предполагал, затем запросите размеры устройства с помощью 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

Смежные вопросы