ř热图与发散调色板(R heatmap with diverging colour palette)

2019-06-25 10:39发布

我想创建R中一个简单的热图,采用发散调色板。 我想使用的梯度,使得低于阈值N的所有数字被指定的颜色(紫色说),和高于阈值的所有数字被指定另一种颜色(比如说橙色)。 越远的数目是从所述阈值时,颜色越深应。

这里有一个简单的数据集:

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.7012346852571,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)的阈值数量

[[编辑]]

我刚才看到这对SO问题 ,这似乎是非常相似的。 答案使用ggplot(我没有经验),而且我至今,已经无法适应ggplot解决我稍微复杂的数据。

Answer 1:

这应该让你最方式。 (请注意,您需要设置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)

编辑

在一起,然后“缝合”起来 - 对于超过阈值的位置更精细的控制,我建议创建两个单独的调色板 - 一个值小于阈值和一个以上的临界值。 尝试这样的事情,对不同的值玩弄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)


Answer 2:

我发现这个线索非常有用,也拉一些想法在这里 ,但我的目的,我需要推广了一些东西,想用RColorBrewer包。 虽然我的工作就可以了布鲁尔博士(颜色布鲁尔成名)停在我的办公室,告诉我,我需要较小的色彩断裂内插值,而不是只挑选了终点。 我想别人,所以我在这里张贴我的函数为后人可能会发现这个有用。

该函数在数据载体中,发散调色板在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))


文章来源: R heatmap with diverging colour palette