R 如何在“周围绘制方框”;“团体”;在热图上?

R 如何在“周围绘制方框”;“团体”;在热图上?,r,graphics,ggplot2,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 =

我画了一张这样的图:

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()
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()
在我意识到我不知道如何继续之前


我所拥有的:

我想要的是:


即类似这样的内容:

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

xmin或
geom\u段

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)))
library('reformae2')
库('ggplot2')

这可能被认为是作弊,但很容易:

# 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")
#根据您的数据,您可以直接生成'd2'
#这里我们需要再点一点

d2你应该可以用
geom_rect
@Roland来做这件事,这就是我的想法。问题是如何识别盒子,关键是不必硬编码坐标。我的真实数据要大得多。@ssdecontrol以编程方式进行分组是另一个问题,这在很大程度上取决于数据的特定约束。可以有多少组?它们总是按照一定的顺序吗?框是否总是由单轴组或多轴组的交点定义?我在回答中硬编码了坐标,因为如果不知道问题的具体情况,就无法为您编写代码。这将更加复杂…这就是为什么我问这个问题我不知道为什么我没有想到这一点。不过,在我的例子中,它可能会很难看。@ssdecontrol,您应该能够稍微修改一下格式,以便在需要时使其更干净;主要的一点是,在这里,你可以使用
ggplot
来计算坐标。它看起来非常漂亮!只是指出一些你在这里包含但没有明确谈论的重要内容:面的顺序与轴的顺序相反。@ssdecontrol,你的意思是需要对V2的级别重新排序吗?我在eval(expr,envir,enclose)中得到
错误:找不到对象
。它似乎应该可以工作,但我在另一个函数中使用它,我知道
ggplot2
范围界定可能很奇怪。这就是我害怕的。我会做一些调试,并在我能让它工作时接受这个答案。确认:警告是,除非在函数内部调用
plot
print
本身,否则它只在顶层工作;如果将
gg
对象返回到另一个作用域/环境,它将无法工作。