在绘图热图中使用离散的自定义颜色 [英] Using discrete custom color in a plotly heatmap
问题描述
我正在尝试生成一个 plotly
heatmap
,我希望通过离散比例指定颜色.
I'm trying to generate a plotly
heatmap
, where I'd like the colors to be specified by a discrete scale.
这就是我的意思:
生成具有 2 个聚类的数据并分层聚类:
Generate data with 2 clusters and hierarchically cluster them:
require(permute)
set.seed(1)
mat <- rbind(cbind(matrix(rnorm(2500,2,1),nrow=25,ncol=500),matrix(rnorm(2500,-2,1),nrow=25,ncol=500)),
cbind(matrix(rnorm(2500,-2,1),nrow=25,ncol=500),matrix(rnorm(2500,2,1),nrow=25,ncol=500)))
rownames(mat) <- paste("g",1:50,sep=".")
colnames(mat) <- paste("s",1:1000,sep=".")
hc.col <- hclust(dist(t(mat)))
dd.col <- as.dendrogram(hc.col)
col.order <- order.dendrogram(dd.col)
hc.row <- hclust(dist(mat))
dd.row <- as.dendrogram(hc.row)
row.order <- order.dendrogram(dd.row)
mat <- mat[row.order,col.order]
将 mat
中的值设为区间并为每个区间设置颜色:
Brake the values in mat
to intervals and set a color for each interval:
require(RColorBrewer)
mat.intervals <- cut(mat,breaks=6)
interval.mat <- matrix(mat.intervals,nrow=50,ncol=1000,dimnames=list(rownames(mat),colnames(mat)))
interval.cols <- brewer.pal(6,"Set2")
names(interval.cols) <- levels(mat.intervals)
使用 ggplot2
我以这种方式绘制此 heatmap
(也让 legend
指定离散的颜色和相应的范围):
Using ggplot2
I draw this heatmap
this way (also having the legend
specify the discrete colors and respective ranges):
require(reshape2)
interval.df <- reshape2::melt(interval.mat,varnames=c("gene","sample"),value.name="expr")
require(ggplot2)
ggplot(interval.df,aes(x=sample,y=gene,fill=expr))+
geom_tile(color=NA)+theme_bw()+
theme(strip.text.x=element_text(angle=90,vjust=1,hjust=0.5,size=6),panel.spacing=unit(0.025,"cm"),legend.key=element_blank(),plot.margin=unit(c(1,1,1,1),"cm"),legend.key.size=unit(0.25,"cm"),panel.border=element_blank(),strip.background=element_blank(),axis.ticks.y=element_line(size=0.25))+
scale_color_manual(drop=FALSE,values=interval.cols,labels=names(interval.cols),name="expr")+
scale_fill_manual(drop=FALSE,values=interval.cols,labels=names(interval.cols),name="expr")
给出:
这是我尝试用 plotly
生成它:
This is my attempt to generate it with plotly
:
plot_ly(z=mat,x=colnames(mat),y=rownames(mat),type="heatmap",colors=interval.cols)
给出:
这些数字并不相同.在 ggplot2
图中,与 plotly
图相比,集群更加明显.
The figures are not identical. In the ggplot2
figure the clusters are much more pronounced in contrast to the plotly
figure.
有什么方法可以对 plotly
命令进行参数化,以提供更类似于 ggplot2
图的东西?
Is there any way to parametrize the plotly
command to give something more similar to the ggplot2
figure?
另外,是否可以使 plotly
图例离散 - 类似于 ggplot2
图中的图例?
Also, is it possible to make the plotly
legend discrete - similar to that in the ggplot2
figure?
现在假设我想facet
集群.在 ggplot2
的情况下,我会这样做:
Now suppose I want to facet
the clusters. In the ggplot2
case I'd do:
require(dplyr)
facet.df <- data.frame(sample=c(paste("s",1:500,sep="."),paste("s",501:1000,sep=".")),facet=c(rep("f1",500),rep("f2",500)),stringsAsFactors=F)
interval.df <- left_join(interval.df,facet.df,by=c("sample"="sample"))
interval.df$facet <- factor(interval.df$facet,levels=c("f1","f2"))
然后绘制:
ggplot(interval.df,aes(x=sample,y=gene,fill=expr))+facet_grid(~facet,scales="free",space="free",switch="both")+
geom_tile(color=NA)+labs(x="facet",y="gene")+theme_bw()+
theme(strip.text.x=element_text(angle=90,vjust=1,hjust=0.5,size=6),panel.spacing=unit(0.05,"cm"),plot.margin=unit(c(1,1,1,1),"cm"),legend.key.size=unit(0.25,"cm"),panel.border=element_blank(),strip.background=element_blank(),axis.ticks.y=element_line(size=0.25))+
scale_color_manual(drop=FALSE,values=interval.cols,labels=names(interval.cols),name="expr")+
scale_fill_manual(drop=FALSE,values=interval.cols,labels=names(interval.cols),name="expr")
这给出了:
因此,簇由 panel.spacing
分隔,看起来更加明显.有什么方法可以用 plotly
实现这种刻面?
So the clusters are separated by the panel.spacing
and look even more pronounced. Is there any way to achieve this faceting with plotly
?
推荐答案
我最初也在想同样的事情,那就是对渐变进行下采样,但强制更苛刻的过渡似乎至少可以使颜色更明显.
I was thinking initially the same thing, which is to down-sample the gradient, but instead forcing harsher transitions seems to do the trick at least to make the colors more pronounced.
interval.cols2 <- rep(interval.cols, each=1000)
plot_ly(z=mat,x=colnames(mat),y=rownames(mat),type="heatmap",colors=interval.cols2)
这篇关于在绘图热图中使用离散的自定义颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!