簡體   English   中英

如何使用 ``ggplot2`` 將數字矩陣中的柵格 plot

[英]How to plot a raster from a numeric matrix with ``ggplot2``

我希望基於數字矩陣創建多面柵格 plot。 構面由矩陣中的行定義。

以下示例數據表示 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)

矩陣中的每一行代表 Shape 的一個可能的 position。 這樣,將一行格式化為具有三列的矩陣將說明 position(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

如圖,第一個position是左上角豎排的位置。

我可以使用anotated_customgrid::rasterGrob function 將 plot 與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

這一次對一個 position 有效。

但是,我的目標是 plot 為每一行(位置)創建一個面板,以便我可以一起查看它們。

我用它來說明 function 的 output,它根據提供的網格大小和形狀長度創建初始矩陣。 因此,解決方案必須足夠靈活,以適應初始矩陣的可變大小和復雜性。

我出於習慣使用ggplot2 ,但我對其他方法持開放態度。

問題:

如何創建多面 plot,其中每個面板代表矩陣中的一行,並格式化為柵格?

您需要將矩陣重塑為適當的數據框:

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

然后 plot 變得簡單明了:

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

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM