如何围绕"组"在热图?

时间:2015-04-28 17:44:15

标签: r graphics ggplot2

我制作了这样的图表:

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)

在我意识到我不知道如何继续之前。

我有什么:

enter image description here

我想要的是什么:

enter image description here

3 个答案:

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

enter image description here

答案 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")

enter image description here

答案 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_hlinegeom_vline,尽管您可能很难移除延伸过彩色矩形边缘的小位。