在 R 中使用 pheatmap 定义特定值着色
Define specific value colouring with pheatmap in R
假设:
m1<-matrix(rnorm(1000),ncol=100)
并定义颜色:
cols = colorRampPalette(c("white", "red"))(30)
我正在生成不使用 pheatmap 函数聚类的热图:
pheatmap(dist(t(m1)), cluster_rows = F, cluster_cols = F, show_rownames = TRUE,
color = cols, main = 'Heatmap')
问题是,我如何定义颜色以获得相同的热图,但只能使用具有特定颜色值(例如小于 0.1)的像素。
我尝试设置
cols = ifelse(dist(t(m1))<0.1,'red','black')
但没用。
对于简单的二元配色方案,您可以使用 breaks
参数:
library(pheatmap)
set.seed(1)
m1<-matrix(c(rnorm(1000)), ncol=100)
pheatmap(dist(t(m1)),
cluster_rows = F,
cluster_cols = F,
show_rownames = TRUE,
color = c("red", "black"),
breaks = c(0, 3, 9), # distances 0 to 3 are red, 3 to 9 black
main = 'Heatmap')
看起来像这样:
如果您更喜欢颜色渐变,可以按如下方式进行:
m <- matrix(c(rnorm(1000)), ncol=100)
distmat <- dist(t(m))
# Returns a vector of 'num.colors.in.palette'+1 colors. The first 'cutoff.fraction'
# fraction of the palette interpolates between colors[1] and colors[2], the remainder
# between colors[3] and colors[4]. 'num.colors.in.palette' must be sufficiently large
# to get smooth color gradients.
makeColorRampPalette <- function(colors, cutoff.fraction, num.colors.in.palette)
{
stopifnot(length(colors) == 4)
ramp1 <- colorRampPalette(colors[1:2])(num.colors.in.palette * cutoff.fraction)
ramp2 <- colorRampPalette(colors[3:4])(num.colors.in.palette * (1 - cutoff.fraction))
return(c(ramp1, ramp2))
}
cutoff.distance <- 3
cols <- makeColorRampPalette(c("white", "red", # distances 0 to 3 colored from white to red
"green", "black"), # distances 3 to max(distmat) colored from green to black
cutoff.distance / max(distmat),
100)
pheatmap(distmat,
cluster_rows = F,
cluster_cols = F,
show_rownames = TRUE,
color = cols,
main = 'Heatmap')
然后看起来像这样:
不是您要的,但这是一个可能对其他人有帮助的 ggplot 解决方案。
set.seed(1) # for reproducible example
m1 <- matrix(rnorm(1000),ncol=100)
d <- dist(t(m1))
library(ggplot2)
library(reshape2) # for melt(...)
gg.df <- melt(as.matrix(d), varnames=c("row","col"))
# fill is red for value < 3; black for value >= 3
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+
geom_tile(aes(fill=ifelse(value<3, "below", "above")), color=NA)+
scale_fill_manual("Threshold",values=c(below="#FF0000", above="#000000"))+
coord_fixed()
# fill is black for value > 3; gradient white to red for value <= 3
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+
geom_tile(aes(fill=value), color=NA)+
scale_fill_gradient(low="#FFFFFF", high="#FF0000", limits=c(0,3), na.value="black")+
coord_fixed()
假设:
m1<-matrix(rnorm(1000),ncol=100)
并定义颜色:
cols = colorRampPalette(c("white", "red"))(30)
我正在生成不使用 pheatmap 函数聚类的热图:
pheatmap(dist(t(m1)), cluster_rows = F, cluster_cols = F, show_rownames = TRUE,
color = cols, main = 'Heatmap')
问题是,我如何定义颜色以获得相同的热图,但只能使用具有特定颜色值(例如小于 0.1)的像素。
我尝试设置
cols = ifelse(dist(t(m1))<0.1,'red','black')
但没用。
对于简单的二元配色方案,您可以使用 breaks
参数:
library(pheatmap)
set.seed(1)
m1<-matrix(c(rnorm(1000)), ncol=100)
pheatmap(dist(t(m1)),
cluster_rows = F,
cluster_cols = F,
show_rownames = TRUE,
color = c("red", "black"),
breaks = c(0, 3, 9), # distances 0 to 3 are red, 3 to 9 black
main = 'Heatmap')
看起来像这样:
如果您更喜欢颜色渐变,可以按如下方式进行:
m <- matrix(c(rnorm(1000)), ncol=100)
distmat <- dist(t(m))
# Returns a vector of 'num.colors.in.palette'+1 colors. The first 'cutoff.fraction'
# fraction of the palette interpolates between colors[1] and colors[2], the remainder
# between colors[3] and colors[4]. 'num.colors.in.palette' must be sufficiently large
# to get smooth color gradients.
makeColorRampPalette <- function(colors, cutoff.fraction, num.colors.in.palette)
{
stopifnot(length(colors) == 4)
ramp1 <- colorRampPalette(colors[1:2])(num.colors.in.palette * cutoff.fraction)
ramp2 <- colorRampPalette(colors[3:4])(num.colors.in.palette * (1 - cutoff.fraction))
return(c(ramp1, ramp2))
}
cutoff.distance <- 3
cols <- makeColorRampPalette(c("white", "red", # distances 0 to 3 colored from white to red
"green", "black"), # distances 3 to max(distmat) colored from green to black
cutoff.distance / max(distmat),
100)
pheatmap(distmat,
cluster_rows = F,
cluster_cols = F,
show_rownames = TRUE,
color = cols,
main = 'Heatmap')
然后看起来像这样:
不是您要的,但这是一个可能对其他人有帮助的 ggplot 解决方案。
set.seed(1) # for reproducible example
m1 <- matrix(rnorm(1000),ncol=100)
d <- dist(t(m1))
library(ggplot2)
library(reshape2) # for melt(...)
gg.df <- melt(as.matrix(d), varnames=c("row","col"))
# fill is red for value < 3; black for value >= 3
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+
geom_tile(aes(fill=ifelse(value<3, "below", "above")), color=NA)+
scale_fill_manual("Threshold",values=c(below="#FF0000", above="#000000"))+
coord_fixed()
# fill is black for value > 3; gradient white to red for value <= 3
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+
geom_tile(aes(fill=value), color=NA)+
scale_fill_gradient(low="#FFFFFF", high="#FF0000", limits=c(0,3), na.value="black")+
coord_fixed()