[英]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_custom
和grid::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.