2015-04-28 81 views
4

我做了這樣一個圖:如何在熱圖中的「組」中繪製框?

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

如何以編程周圍畫了「一個」盒子「 B」和「C」的羣體?

矩陣m將始終爲正方形。 colnames(m)rownames(m)將始終相同。因此這些盒子將覆蓋整個網格並且不會重疊。一般來說,團隊規模會有所不同。我也沒有結婚ggplot2。如果它不是ggplot2/grid版本,我可以打開基礎圖形的解決方案image

我得到儘可能

d$group <- substr(d$Var1, 1, 1) 

我才意識到我根本不知道如何着手。


我有什麼:

enter image description here

我想要什麼:

enter image description here

+2

你應該能夠使用'geom_rect'做到這一點。 – Roland

+0

@羅蘭這就是我的想法。問題是如何識別框。 – shadowtalker

回答

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

+0

我不知道爲什麼我沒有想到這一點。不過,對我而言,這可能會變得很醜。 – shadowtalker

+0

@ssdecontrol,你應該可以把格式弄亂一點,以便在需要時使它更清晰;主要的一點是在這裏你使用'ggplot'來爲你計算座標。 – BrodieG

+0

它實際上出來看起來非常好! – shadowtalker

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,儘管您可能很難去除延伸到彩色矩形邊緣的小點。

+0

整點是不必對座標進行硬編碼。我的真實數據要大得多。 – shadowtalker

+0

@ssdecontrol以編程方式進行組是另一個問題,它將強烈依賴於您的數據的特定約束。可以有多少組?他們會一直按照一定的順序嗎?這些方框是否始終由單軸組的交叉點定義,還是多個?我在答案中硬編碼座標,因爲如果不知道問題的具體細節,就無法爲您編寫代碼。而且它會複雜得多。 – joran

+0

...這就是爲什麼我問這個問題 – shadowtalker

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

+0

@ssdecontrol請參閱編輯 – rawr

+0

我得到'eval(expr,envir,enclos)中的錯誤:object'll'not found'。它似乎想要工作,但我在另一個函數中使用它,我知道'ggplot2'範圍可能是奇怪的。 – shadowtalker

+0

我重新啓動了我的R會話,並沒有得到那個錯誤 – rawr