我制作了这样的图表:
library(reshape2)
library(ggplot2)
m <- matrix(1:64 - 32, 8)
rownames(m) <- colnames(m) <-
c(paste0("a", 1:3), paste0("b", 1:2), paste0("c", 1:3))
d <- melt(m)
gg <- ggplot(d) +
geom_tile(aes(x = Var1, y = Var2, fill = value)) +
scale_fill_gradient2()
如何以编程方式在&#34; a&#34;,&#34; b&#34;和&#34; c&#34;周围绘制框?群体?
矩阵m
将始终为方形。 colnames(m)
和rownames(m)
将永远相同。因此,盒子将覆盖整个网格,并且永远不会重叠。一般来说,群体规模会有所不同。
我还没跟ggplot2
结婚。如果它不是image
/ ggplot2
版本,那么我可以使用grid
打开基础图形解决方案。
我到目前为止
d$group <- substr(d$Var1, 1, 1)
在我意识到我不知道如何继续之前。
我有什么:
我想要的是什么:
答案 0 :(得分:6)
或geom_segment
library('reshape2')
library('ggplot2')
m <- matrix(1:64 - 32, 8)
rownames(m) <- colnames(m) <-
c(paste0("a", 1:3), paste0("b", 1:2), paste0("c", 1:3))
gg <- ggplot(melt(m)) +
geom_tile(aes(x = Var1, y = Var2, fill = value)) +
scale_fill_gradient2()
tt <- table(gsub('\\d+', '', colnames(m)))
ll <- unname(c(0, cumsum(tt)) + .5)
gg + geom_segment(aes(x = ll, xend = ll, y = head(ll, 1), yend = tail(ll, 1))) +
geom_segment(aes(y = ll, yend = ll, x = head(ll, 1), xend = tail(ll, 1)))
答案 1 :(得分:4)
这可能被视为作弊,但很容易:
# Depending on your data you may be able to generate `d2` directly
# here we need to re-order a bit
d2 <- transform(
d, V1 = substr(Var1, 1, 1),
V2=factor(substr(Var2, 1, 1), levels=letters[3:1])
)
ggplot(d2) +
geom_tile(aes(x = Var1, y = Var2, fill = value)) +
scale_fill_gradient2() +
facet_grid(V2 ~ V1, scales="free", space="free")
答案 2 :(得分:2)
即。像这样的东西:
xmin <- c(0.5,3.5,5.5)
xmax <- c(3.5,5.5,8.5)
ymin <- c(0.5,3.5,5.5)
ymax <- c(3.5,5.5,8.5)
box1 <- data.frame(xmin = rep(xmin,times = 3),
xmax = rep(xmax,each = 3),
ymin = rep(ymin,times = 3),
ymax = rep(ymax,each = 3))
ggplot(melt(m)) +
geom_tile(aes(x = Var1, y = Var2, fill = value)) +
geom_rect(data = box1,aes(xmin = xmin,xmax = xmax,ymin = ymin,ymax= ymax),
fill = NA,color = "black") +
scale_fill_gradient2()
另一种选择是简单地使用geom_hline
和geom_vline
,尽管您可能很难移除延伸过彩色矩形边缘的小位。