我有一个matrix
(基因表达来自几个条件):
set.seed(1)
mat <- matrix(rnorm(50*10),nrow=50,ncol=10,dimnames=list(paste("C",1:50,sep="."),paste("G",1:10,sep=".")))
我希望在heatmap
中使用plotly
绘制为R
。
require(plotly)
heatmap.plotly <- plot_ly(x=colnames(mat),y=rownames(mat),z=mat,type="heatmap",colors=colorRamp(c("darkblue","white","darkred")),colorbar=list(title="Score",len=0.4)) %>%
layout(yaxis=list(title="Condition"),xaxis=list(title="Gene"))
工作正常。
但是,我想添加仅在悬停时才能看到的文字。
我认为这样可行:
conditions.text <- paste(paste("C",1:50,sep="."),rep(paste(LETTERS[sample(26,10,replace=T)],collapse=""),50),sep=":")
heatmap.plotly <- plot_ly(x=colnames(mat),y=rownames(mat),z=mat,type="heatmap",colors=colorRamp(c("darkblue","white","darkred")),colorbar=list(title="Score",len=0.4),hoverinfo='text',text=~conditions.text) %>%
layout(yaxis=list(title="Condition"),xaxis=list(title="Gene"))
但事实并非如此。实际上,当我将鼠标悬停在情节上时,我看不到任何文字。
请注意,我正在使用matrix
而不是melted
data.frame
。
答案 0 :(得分:3)
您将50x10的数组传递到热图中,但是将50个条目列为hoverinfo。热图和文本的输入必须具有相同的尺寸。
library(plotly)
set.seed(1)
mat <- matrix(rnorm(50*10),nrow=50,ncol=10,dimnames=list(paste("C",1:50,sep="."),paste("G",1:10,sep=".")))
conditions.text <- paste(paste("C",1:50,sep="."),rep(paste(LETTERS[sample(26,10,replace=T)],collapse=""),500),sep=":")
conditions.text <- matrix(unlist(conditions.text), ncol = 10, byrow = TRUE)
plot_ly(z=mat,
type="heatmap",
hoverinfo='text',
text=conditions.text)
答案 1 :(得分:1)
因此,plotly中的~
语法旨在用作data = ...
对象的引用,例如data$...
。由于情节的热图不适用于data
参数,因此它不会在这里工作。您需要构造一个与mat
具有相同维度的矩阵,以便提供给text = ...
参数。有点笨重,但它有很好的情节:
# make a matrix same dimensions as mat
text.mat <- matrix(conditions.text, nrow(mat), ncol(mat))
heatmap.plotly <- plot_ly(x=colnames(mat),y=rownames(mat),z=mat,
type="heatmap",colors=colorRamp(c("darkblue","white","darkred")),
colorbar=list(title="Score",len=0.4), hoverinfo='text', text=text.mat) %>%
layout(yaxis=list(title="Condition"),xaxis=list(title="Gene"))
heatmap.plotly
如果要为文本构建多行hoverinfo,只需在<\br>
中使用内联text.mat
标记,并将其作为html读取,并在呈现时创建行返回。