我希望创建一个基于数字矩阵的分面光栅图.面由矩阵中的行定义.
以下示例数据表示2 x 1单元形状("形状")在3 x 3网格上水平和垂直放置的所有方式.
m1 <- matrix(c(1,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,1,0,0,
0,1,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,1,
1,1,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,0,
0,0,0,0,0,0,1,1,0,
0,0,0,0,0,0,0,1,1), ncol = 9, byrow = TRUE)
矩阵中的每一行表示形状的可能位置.因此,将一行格式化为一个包含三列的矩阵将说明位置(1=占用的单元格,0=未占用的单元格).
matrix(m1[1,], ncol = 3, byrow = TRUE)
#> [,1] [,2] [,3]
#> [1,] 1 0 0
#> [2,] 1 0 0
#> [3,] 0 0 0
由reprex package(v2.0.1)于2022-05-03创建
如图所示,第一个位置是左上角的垂直位置.
我可以用anotated_custom
和grid::rasterGrob
函数绘制ggplot2
.
library(ggplot2)
library(grid)
m1 <- matrix(c(1,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,1,0,0,
0,1,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,1,
1,1,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,0,
0,0,0,0,0,0,1,1,0,
0,0,0,0,0,0,0,1,1), ncol = 9, byrow = TRUE)
#create a raster grob object from the first row of the matrix
g <- grid::rasterGrob(matrix(m1[1,], ncol = 3, byrow = TRUE),
interpolate = FALSE)
#adjust the colours
g$raster[g$raster == "#FFFFFF"] <- "#0000FF"
g$raster[g$raster == "#000000"] <- "#FFFFFF"
g$raster
#> [,1] [,2] [,3]
#> [1,] "#0000FF" "#FFFFFF" "#FFFFFF"
#> [2,] "#0000FF" "#FFFFFF" "#FFFFFF"
#> [3,] "#FFFFFF" "#FFFFFF" "#FFFFFF"
ggplot() +
annotation_custom(g) +
coord_equal() +
theme(
panel.border = element_rect(colour = "#000000", fill = "transparent")
)
由reprex package(v2.0.1)于2022-05-03创建
一次只适合一个职位.
然而,我的目标是为每一行(位置)绘制一个面板,以便我可以一起查看它们.
我用它来说明一个函数的输出,该函数根据提供的网格大小和形状长度创建初始矩阵.因此,解决方案必须足够灵活,以适应初始矩阵中可变的大小和复杂性.
我使用ggplot2
是出于习惯,但我对其他方法持开放态度.
Question:
如何创建分面打印,其中每个面板代表矩阵中的一行,并格式化为光栅?