我希望创建一个基于数字矩阵的分面光栅图.面由矩阵中的行定义.

以下示例数据表示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_customgrid::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:

如何创建分面打印,其中每个面板代表矩阵中的一行,并格式化为光栅?

推荐答案

您需要将矩阵reshape 为适当的数据框架:

df <- data.frame(fill = factor(c(t(m1))),
                 row = factor(rep(rep(1:3, each = 3), len = length(m1)), 3:1),
                 col = factor(rep(1:3, len = length(m1))),
                 fac = factor(rep(seq(nrow(m1)), each = ncol(m1))))

然后情节变得简单明了:

ggplot(df, aes(col, row, fill = fill)) +
  geom_tile() +
  facet_wrap(.~fac) +
  coord_equal() +
  scale_fill_manual(values = c(`1` = "navy", `0` = "white"))

enter image description here

R相关问答推荐

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

在位置周围设定一个半径并识别该半径内的其他位置

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

如何从R中的字符串元素中减go 一个数字?

ggplot的轴标签保存在officer中时被剪切

如何在kableextra调用cell_spec()中忽略NA?

在某些栏和某些条件下,替换dfs列表中的NA

如何计算多个日期是否在一个日期范围内

使用across,starts_with和ifelse语句变更多个变量

在R中使用Scale_y_Break后更改y轴标签

如何使用ggplot对堆叠条形图进行嵌套排序?

try 将 colored颜色 编码添加到ggploly的标题中

使用RSelenium在R中抓取Reddit时捕获多个标签

变长向量的矢量化和

在散点图中使用geom_point放置线图例

无法将条件case_when()应用于使用!!创建的新变量Mutations

按组和连续id计算日期差

将y轴格式更改为R中的百分比

创建由三个单独的shapefile组成的单个 map

即使使用相同的种子,mtry值也取决于TuneGrid范围