我有一个布尔矩阵:
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")))
对于这个矩阵,我想制作一个与此类似的情节:
(图片来自Matlab的类似问题:How can I display a 2D binary matrix as a black & white plot?)
也许我错过了一些明显的东西,但我在R中看不到如何做到这一点的简单方法。到目前为止,我最好的尝试是基于条形图:
m1 <- matrix(TRUE,ncol=10,nrow=10)
barplot(m1,col=mm)
但它会使所有行具有相同的颜色。
欢迎任何想法
答案 0 :(得分:6)
你可以使用ggplot2&#39; s geom_tile
和reshape2&#39; s 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")
最终输出:
答案 1 :(得分:5)
以下是 qdap 包中使用qheat
ggplot2 包装的方法:
library(qdap)
qheat(t(data.frame(mm)), by.column=NULL, high="black", text.color =NA,
grid="grey20") + guides(fill=FALSE)
答案 2 :(得分:5)
以下是一些完善图形选项的方法。
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])
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))
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))
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))
raster
设置图形设备的尺寸可能有点繁琐,以致raster
不会在预期的x和y限制之外绘制其他(部分)单元格。使用此方法时,如果目标是导出到例如png,我首先绘制到windows
/ x11
/ quartz
并调整窗口大小,直到绘制区域符合我的预期,然后使用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))
答案 3 :(得分:4)
以下是使用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)