Ich versuche, eine plotly
heatmap
zu generieren, wo ich möchte, dass die Farben durch eine diskrete Skala angegeben werden.Verwenden von diskreten benutzerdefinierten Farbe in einer Plotly Heatmap
Hier ist, was ich meine:
Generieren von Daten mit zwei Clustern und sie hierarchisch gruppieren:
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]
Brems die Werte in mat
zu Intervallen und eine Farbe für jedes Intervall eingestellt:
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)
Mit ggplot2
zeichne ich diese heatmap
auf diese Weise (auch mit der legend
spezifizieren die diskrete Farben und entsprechende Bereiche):
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")
Dies ist mein Versuch, es mit plotly
zu generieren:
plot_ly(z=mat,x=colnames(mat),y=rownames(mat),type="heatmap",colors=interval.cols)
die gibt:
Die Figuren sind nicht identisch. In der Figur ggplot2
sind die Cluster im Gegensatz zur plotly
Figur deutlich ausgeprägter.
Gibt es eine Möglichkeit, den plotly
Befehl zu parametrisieren, um etwas ähnlicheres an die ggplot2
Zahl zu geben?
Ist es auch möglich, die plotly
Legende diskret zu machen - ähnlich wie in der ggplot2
Abbildung?
Nun nehme ich an facet
die Cluster. Im ggplot2
Fall würde ich tun:
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"))
Und dann Grundstück:
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")
So werden die Cluster durch die panel.spacing
getrennt sind, und suchen noch ausgeprägter. Gibt es eine Möglichkeit, diese Facettierung mit plotly
zu erreichen?
Was ist mit 'ggplotly' zu erscheinen? – Axeman
Für diese Dimensionen die Umwandlung der ggplot zu plotly mit ggplotly dauert unvernünftig lang (viele viele Minuten) - nicht wirklich praktisch – dan