2014-01-22 129 views
0

這裏有一點我不太深入。我有以下代碼生成兩個相等大小的矩陣:R中的顏色依賴條形圖

MAX<-100 
m<-5 
n<-40 

success<-matrix(runif(m*n,0,1),m,n) 
samples<-floor(MAX*matrix(runif(m*n),m))+1 

success的矩陣是成功的概率和samples矩陣是在每種情況下觀察到的樣品的相應的數字。我想製作一個條形圖,將每列組合在一起,高度由success矩陣決定。每個條的顏色需要是與觀察次數相對應的顏色(從1toMAX縮放)(例如,小樣本會更紅,例如高樣本可能會變綠)。

任何想法?

+0

那麼你想要一個堆疊的條形圖,其中堆棧中的每一層對應於矩陣中的一行?你打算如何繪製3D矩陣(行,列,值),基本上是2d格式(x位置,y高度)。 – BrodieG

+0

我希望成排矩陣的行按行分組......所以,條形圖將有40組高度,每組5個小節。我希望每個欄的顏色編碼爲1到MAX(100)之間的值。你是這個意思嗎? – testname123

回答

0

使用@ BrodieG的data.long,該地塊可能會更容易一些解釋。

library(ggplot2) 
library(RColorBrewer) # for brewer.pal(...) 
ggplot(data.long) + 
    geom_bar(aes(x=x, y=success, fill=count),colour="grey70",stat="identity")+ 
    scale_fill_gradientn(colours=brewer.pal(9,"RdYlGn")) + 
    facet_grid(group~.) 

注意,實際值可能是不同的,因爲你的樣品中使用隨機數。將來,請考慮使用set.seed(n)來生成可重現的隨機樣本。

編輯 [迴應OP的評論]

,因爲你開始矩陣,而不是data.frames您獲得x軸和小標籤號碼。因此,將successsamples轉換爲data.frames,將列名稱設置爲您的測試名稱,並在「列表因子」前加上group列。現在轉換爲長格式有點不同,因爲第一列有組名。設置閾值的顏色

library(reshape2) 
set.seed(1) 
success <- data.frame(matrix(runif(m*n,0,1),m,n)) 
success <- cbind(group=rep(paste("Factor",1:nrow(success),sep=".")),success) 
samples <- data.frame(floor(MAX*matrix(runif(m*n),m))+1) 
samples <- cbind(group=success$group,samples) 
data.long <- cbind(melt(success,id=1), melt(samples, id=1)[3]) 
names(data.long) <- c("group", "x", "success", "count") 

一種方法是添加一列data.long和使用,爲fill

threshold <- 25 
data.long$fill <- with(data.long,ifelse(count>threshold,max(count),count)) 

全部放在一起:

library(ggplot2) 
library(RColorBrewer) 
ggplot(data.long) + 
    geom_bar(aes(x=x, y=success, fill=fill),colour="grey70",stat="identity")+ 
    scale_fill_gradientn(colours=brewer.pal(9,"RdYlGn")) + 
    facet_grid(group~.)+ 
    theme(axis.text.x=element_text(angle=-90,hjust=0,vjust=0.4)) 

最後,當你有x的名字軸標籤往往會卡在一起,所以我旋轉了名稱-90 °。

+0

非常好。你可以隨意改變綠色的門檻值嗎?換句話說,使25以上的任何「計數」都是綠色,其餘的顏色連續介於25和0之間?有沒有辦法用字符的矢量替換底部和右側軸上的索引?我有底部的測試名稱和右側軸的因素列表。 – testname123

+0

查看我上面的編輯。 – jlhoward

+0

非常感謝!是否有任何書籍或資源可以推薦您達到您使用該語言的水平?正如你所看到的,我的基本理解恰恰足以讓你陷入困境或者在項目的中途擱淺! :) 謝謝 – testname123

1

以下是ggplot的示例。首先,獲得的數據爲長格式與熔體:

library(reshape2) 
data.long <- cbind(melt(success), melt(samples)[3]) 
names(data.long) <- c("group", "x", "success", "count") 
head(data.long) 
# group x success count 
# 1  1 1 0.48513473  8 
# 2  2 1 0.56583802 58 
# 3  3 1 0.34541582 40 
# 4  4 1 0.55829073 64 
# 5  5 1 0.06455401 37 
# 6  1 2 0.88928606 78 

注意melt將通過行/列組合的迭代矩陣都以同樣的方式,所以我們只要cbind所產生的熔融的數據幀。第二個melt之後的[3]是這樣的,所以我們不會以重複的組和x值(我們只需要來自第二個melt的計數)結束。現在,讓我們ggplot做它的事:

library(ggplot2) 
ggplot(data.long, aes(x=x, y=success, group=group, fill=count)) + 
    geom_bar(position="stack", stat="identity") + 
    scale_fill_gradient2(
    low="red", mid="yellow", high="green", 
    midpoint=mean(data.long$count) 
) 

enter image description here

+0

太好了。它們可以被迫在彼此旁邊,就像barplot中的beside = TRUE參數一樣嗎? – testname123

+0

@ user3033594在'geom_bar()'裏面試試'position =「dodge」',但是如果你這樣做,就很難說出x值是什麼。此外,如果你這樣做,你將有200個酒吧,這很難區分。那真的是你想要的嗎? – BrodieG