2012-06-11 28 views
4

我想在R中使用發散的調色板創建一個簡單的熱圖。我想要使​​用漸變,以便低於閾值N的所有數字都被指定爲一種顏色(如紫色),並且高於閾值的所有數字都被指定爲另一種顏色(如橙色)。離閾值越遠,顏色越深。R散熱圖與發散的調色板

下面是一個示例數據集:

Division,COL1,COL2,COL3,COL4,COL5,COL6,COL7 
Division 1,31.9221884012222,75.8181694429368,97.0480443444103,96.295954938978,70.5677134916186,63.0451830103993,93.0396212730557 
Division 2,85.7,29.0621076244861,16.9130333233625,94.6443660184741,19.9103083927184,61.9562198873609,72.3791105207056 
Division 3,47.1665125340223,99.4153356179595,8.51091076619923,79.1276383213699,41.915355855599,7.45079894550145,24.6946100145578 
Division 4,66.0743870772421,24.6163331903517,78.694460215047,42.04714265652,50.2694897353649,73.0409651994705,87.3745442833751 
Division 5,29.6664374880493,35.4036891367286,19.2967326845974,5.48460693098605,32.4517334811389,15.5926876701415,76.0523204226047 
Division 6,95.4969164915383,8.63230894319713,61.7535551078618,24.5590241160244,25.5453423131257,56.397921172902,44.4693325087428 
Division 7,87.5015622004867,28.7770316936076,56.5095080062747,34.6680747810751,28.1923673115671,65.0204187724739,13.795713102445 
Division 8,70.1077231671661,72.4712177179754,38.4903231170028,36.1821102909744,97.0875509083271,17.184783378616,78.2292529474944 
Division 9,47.3570406902581,90.2257485780865,65.6037972308695,77.0234781783074,25.6294377148151,84.900529962033,82.5080851092935 
Division 10,58.0811711959541,0.493217632174492,58.5604055318981,53.5780876874924,9.12552657537162,20.313960686326,78.1371118500829 
Division 11,34.6708688884974,76.711881859228,22.6064443588257,22.1724311355501,5.48891355283558,79.1159523651004,56.8405059166253 
Division 12,33.6812808644027,44.1363711375743,70.6362190190703,3.78900407813489,16.6075889021158,9.12654218263924,39.9711143691093 

下面是一個簡單片斷到從上述數據

data <- read.csv("dataset.csv", sep=",") 
row.names(data) <- data$Division 
data <- data[,2:7] 
data_matrix <- data.matrix(data) 
heatmap(data_matrix, Rowv=NA, Colv=NA, col = heat.colors(256), scale="column", margins=c(5,10)) 

產生熱圖如何修改上面的代碼以產生:

  • 所有數字大於50的顏色漸變(橙色)(越深,數字越大,從50開始)
  • 顏色梯度(紫色)爲少於50的所有數字(較暗的進一步的數目爲50)
  • 最好有(但可選)寫在網格單元
  • 最好有數目的值(但可選),使用不同的顏色用於網格單元這正是閾值數量(50在這種情況下)

[[編輯]]

我剛纔看到這個question on SO,這似乎是非常類似。答案使用ggplot(我沒有經驗),到目前爲止,我無法將ggplot解決方案適用於我稍微複雜的數據。

+1

了'RColorBrewer'包裝具有良好的palletes:嘗試'RColorBrewer :::啤酒.pal(11,「PuOr」)',然後指定一個休息參數,儘管你可能需要通過'image()'函數來完成。 –

+0

@timriffe - 不錯的建議。我偷了你的配色方案,我的答案如下 - 希望你不介意) –

+0

@ JoshO'Brien肯定。在實驗室空間上插入的方式! –

回答

8

這應該會讓你獲得最好的效果。 (請注意,如果要繪製顏色對應單元格的實際值(而不是重新縮放),則需要設置scale="none")。

ncol <- 100 

## Make a vector with n colors 
cols <- RColorBrewer:::brewer.pal(11,"PuOr") # OR c("purple","white","orange") 
rampcols <- colorRampPalette(colors = cols, space="Lab")(ncol) 
rampcols[(n/2) + 1] <- rgb(t(col2rgb("green")), maxColorValue=256) 

## Make a vector with n+1 breaks 
rampbreaks <- seq(0, 100, length.out = ncol+1) 

## Try it out 
heatmap(data_matrix, Rowv = NA, Colv = NA, scale="none", 
     col = rampcols, breaks = rampbreaks) 

enter image description here

編輯

對於超過閾值的位置更精細的控制,我建議創建兩個單獨的調色板 - 一個值小於閾值,一個用於值高於閾值 - 然後「縫合」在一起。嘗試這樣的事情,不同的值玩弄於MinMaxThresh等:

nHalf <- 50 

Min <- 0 
Max <- 100 
Thresh <- 50 

## Make vector of colors for values below threshold 
rc1 <- colorRampPalette(colors = c("purple", "white"), space="Lab")(nHalf)  
## Make vector of colors for values above threshold 
rc2 <- colorRampPalette(colors = c("white", "orange"), space="Lab")(nHalf) 
rampcols <- c(rc1, rc2) 
## In your example, this line sets the color for values between 49 and 51. 
rampcols[c(nHalf, nHalf+1)] <- rgb(t(col2rgb("green")), maxColorValue=256) 

rb1 <- seq(Min, Thresh, length.out=nHalf+1) 
rb2 <- seq(Thresh, Max, length.out=nHalf+1)[-1] 
rampbreaks <- c(rb1, rb2) 

heatmap(data_matrix, Rowv = NA, Colv = NA, scale="none", 
     col = rampcols, breaks = rampbreaks) 
+0

謝謝喬希!我不敢相信你用這麼幾行代碼來設法創建它!對於所有這些(R,RColorBrewer等)我都很新穎,我很努力地理解你對'魔術數字'(例如'100','11'等)的使用,以及它與我原始數據的關係,以及'截止門檻值50(在我的例子中使用)。您能否介紹一下:** 1。**您使用的號碼來自哪裏? ** 2。**我如何設定門檻值? ** 3。**如果單元格值大約爲閾值,則不清楚如何(或在哪裏)設置綠色背景的標準。 –

+0

@JoshOBrien:最後但並非最不重要的,如果我想寫在單元格中的值(如在這個例子中:http://stackoverflow.com/questions/8161014/custom-heat-map-in-r/8161231# 8161231),我該怎麼做?謝謝 –

+0

@JoshOBrien:我問起如何設置閾值的原因是,例如,我可以爲正數和負數使用不同的顏色(通過將閾值數設置爲0)。我無法解決如何從片段中做到這一點... –

3

我發現這個線索非常有用,還拉一些想法從here,但我的目的,我需要一些推廣事情,並希望使用RColorBrewer包。在我工作的時候,布魯爾博士(Color Brewer的名氣)在我的辦公室停了下來,告訴我需要在較小的顏色中插入內插,而不是僅僅選擇端點。我認爲其他人可能會覺得這很有用,所以我在這裏發佈我的功能爲後代。

該函數接受數據向量,發散colorBrewer調色板的名稱和顏色方案的中心點(默認值爲0)。它輸出一個包含2個對象的列表:一個classIntervals對象和一個顏色矢量:該函數設置爲內插總共100種顏色,但可以小心修改。

diverge.color <- function(data,pal_choice="RdGy",centeredOn=0){ 
    nHalf=50 
    Min <- min(data,na.rm=TRUE) 
    Max <- max(data,na.rm=TRUE) 
    Thresh <- centeredOn 
    pal<-brewer.pal(n=11,pal_choice) 
    rc1<-colorRampPalette(colors=c(pal[1],pal[2]),space="Lab")(10) 
    for(i in 2:10){ 
    tmp<-colorRampPalette(colors=c(pal[i],pal[i+1]),space="Lab")(10) 
    rc1<-c(rc1,tmp) 
    } 
    rb1 <- seq(Min, Thresh, length.out=nHalf+1) 
    rb2 <- seq(Thresh, Max, length.out=nHalf+1)[-1] 
    rampbreaks <- c(rb1, rb2) 
    cuts <- classIntervals(data, style="fixed",fixedBreaks=rampbreaks) 
    return(list(cuts,rc1)) 
} 
在我的工作

我使用此方案來繪製光柵層使用spplot像這樣(RS):

brks<-diverge.color(values(rs)) 
spplot(rs,col.regions=brks[[2]],at=brks[[1]]$brks,colorkey=TRUE))