Ticktext值不能修复ggplot2 facet_grid()与ggplotly()组合时出现的故障

Ticktext值不能修复ggplot2 facet_grid()与ggplotly()组合时出现的故障,r,ggplot2,ggplotly,R,Ggplot2,Ggplotly,我有一个数据帧: gene_symbol<-c("DADA","SDAASD","SADDSD","SDADD","ASDAD","XCVXCVX","EQWESDA","DASDADS","SDASDASD","DADADASD","sdaadfd","DFSD","SADADDAD","SADDADADA","DADSADSASDWQ","SDADASDAD","ASD","DSADD") panel<-c("growth","growth","growth","growth",

我有一个数据帧:

gene_symbol<-c("DADA","SDAASD","SADDSD","SDADD","ASDAD","XCVXCVX","EQWESDA","DASDADS","SDASDASD","DADADASD","sdaadfd","DFSD","SADADDAD","SADDADADA","DADSADSASDWQ","SDADASDAD","ASD","DSADD")
panel<-c("growth","growth","growth","growth","big","big","big","small","small","dfgh","DF","DF","DF","DF","DF","gh","DF","DF")
ASDDA<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDb<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf1<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf2<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf3<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf4<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf5<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDA1<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDb1<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf1<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf11<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf21<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf31<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf41<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
ASDDAf51<-c("normal","over","low","over","normal","over","low","over","normal","over","DF","DF","DF","DF","DF","DF","DF","DF")
Gene_states22 <- data.frame(gene_symbol, panel, ASDDA, ASDDb, ASDDAf, ASDDAf1, ASDDAf2, 
                            ASDDAf3, ASDDAf4, ASDDAf5, ASDDA1, ASDDb1, ASDDAf1, ASDDAf11,
                            ASDDAf21, ASDDAf31, ASDDAf41, ASDDAf51)
但热图仍然不正确:

所以首先要做的事情是:

在你的情况下,我甚至不确定你是否需要一张热图。此外,您应该永远不要将复杂的
ggplot
转换为plotly。它会失败的!在90%的情况下。尝试在
plotly
或任何您希望它结束的地方重新创建绘图。任何其他的东西都会陷入地狱

我首先做了一些研究:

  • 很好地描述了如何在
    plotly
  • 解释如何在子地块中创建标题 从第1篇文章中,我知道我必须为数据中的每个级别创建一个矩阵。所以我写了一个函数:

    mymat<-as.matrix(Gene_states22[,-1:-2])
    
    ### Creates a 1-NA dummy matrix for each level. The output is stored in a list
    dummy_mat<-function(mat,levels,names_col){
      mat_list<-lapply(levels,function(x){
                                mat[mat!=x]=NA
                                mat[mat==x]=1
                                mymat=t(apply(mat,2,as.numeric))
                                colnames(mymat)=names_col
                                return(mymat)
                                })
      names(mat_list)=levels
      return(mat_list)
    }
    my_mat_list<-dummy_mat(mymat,c('DF','low','normal','over'),Gene_states22$gene_symbol)
    
    ### Optional: The heatmap type is peculiar - I created a text-NA matrix for each category as well
    text_mat<-function(mat,levels,names_col){
      mat_list<-lapply(levels,function(x){
                                mat[mat!=x]=NA
                                mat=t(mat)
                                colnames(mat)=names_col
                                return(mat)
                                })
      names(mat_list)=levels
      return(mat_list)
    }
       my_mat_list_t<-text_mat(mymat,c('DF','low','normal','over'),as.character(Gene_states22$gene_symbol))
    
    此外,我们需要矩阵中每个面板类别的列:

    mycols<-lapply(levels(Gene_states22$panel),function(x) grep(x,Gene_states22$panel))
    

    可能的问题

  • 您必须围绕只出现一次的类别创建,如
    dfgh
    。如果在
    R
    中只选择了一列,则输出将自动转换为(数字或字符)
    矢量类型。因此,可以向所有
    z
    text
    参数添加
    as.matrix()
  • 悬停文本实际上不起作用。但是
    plotly
    有一个很好的文档。你应该能弄明白
  • 您还必须在
    子批次
    -函数中指定宽度。如果你有10个以上的分类,那就太麻烦了
  • 交互性实际上不起作用。你不能删除痕迹。为什么?不知道。如果你需要,做一些调查。我想这与情节类型有关
  • 我建议在px中指定绘图的延伸。这可能会使瓷砖更相似
  • 最后,您将需要一些,您将需要调整您的绘图页边距。使标题可见
    在plotly中创建整个内容,然后使用子地块组合这些内容。Plotly不做面处理我在Plotly方面经验很少,所以我选择了这个,因为我看到了一个类似的案例。如果你能用你的解决方案重新创建它,那就太好了。
    mymat<-as.matrix(Gene_states22[,-1:-2])
    
    ### Creates a 1-NA dummy matrix for each level. The output is stored in a list
    dummy_mat<-function(mat,levels,names_col){
      mat_list<-lapply(levels,function(x){
                                mat[mat!=x]=NA
                                mat[mat==x]=1
                                mymat=t(apply(mat,2,as.numeric))
                                colnames(mymat)=names_col
                                return(mymat)
                                })
      names(mat_list)=levels
      return(mat_list)
    }
    my_mat_list<-dummy_mat(mymat,c('DF','low','normal','over'),Gene_states22$gene_symbol)
    
    ### Optional: The heatmap type is peculiar - I created a text-NA matrix for each category as well
    text_mat<-function(mat,levels,names_col){
      mat_list<-lapply(levels,function(x){
                                mat[mat!=x]=NA
                                mat=t(mat)
                                colnames(mat)=names_col
                                return(mat)
                                })
      names(mat_list)=levels
      return(mat_list)
    }
       my_mat_list_t<-text_mat(mymat,c('DF','low','normal','over'),as.character(Gene_states22$gene_symbol))
    
    DF_Color <- data.frame(x = c(0,1), y = c("#DEDEDE", "#DEDEDE"))
    colnames(DF_Color) <- NULL
    
    lowColor <- data.frame(x = c(0,1), y = c("#00CCFF", "#00CCFF"))
    colnames(lowColor) <- NULL
    
    normColor <- data.frame(x = c(0,1), y = c("#DEDE00", "#DEDE00"))
    colnames(normColor) <- NULL
    
    overColor <- data.frame(x = c(0,1), y = c("#DE3333", "#DE3333"))
    colnames(overColor) <- NULL
    
    mycols<-lapply(levels(Gene_states22$panel),function(x) grep(x,Gene_states22$panel))
    
    library(plotly)
    
    p_list<-lapply(1:length(mycols),function(j){
      columns<-mycols[[j]]
    
    p<-plot_ly(
        type = "heatmap"
    ) %>% add_trace(
        y=rownames(my_mat_list$DF),x=colnames(my_mat_list$DF)[columns],
        z = my_mat_list$DF[,columns],
        xgap=3,ygap=3, text=my_mat_list_t$DF[,columns],hoverinfo="x+y+text",
        colorscale = DF_Color,
        colorbar = list(
            len = 0.3,
            y = 0.3,
            yanchor = 'top',
            title = 'DF series',
            tickvals = ''
        )
    ) %>% add_trace(
      y=rownames(my_mat_list$low),x=colnames(my_mat_list$low)[columns],
        z = my_mat_list$low[,columns],
        xgap=3,ygap=3,text=my_mat_list_t$low[,columns],hoverinfo="x+y+text",
        colorscale = lowColor,
        colorbar = list(
            len = 0.3,
            y = 0.3,
            yanchor = 'top',
            title = 'low series',
            tickvals = ''
        )
    ) %>% add_trace(
      y=rownames(my_mat_list$normal),x=colnames(my_mat_list$normal)[columns],
        z = my_mat_list$normal[,columns],
        xgap=3,ygap=3,text=my_mat_list_t$normal[,columns],hoverinfo="x+y+text",
        colorscale = normColor,
        colorbar = list(
            len = 0.3,
            y = 1,
            yanchor = 'top',
            title = 'normal series',
            tickvals = ''
        )
    ) %>% add_trace(
      y=rownames(my_mat_list$over),x=colnames(my_mat_list$over)[columns],
        z = my_mat_list$over[,columns],
        xgap=3,ygap=3,text=my_mat_list_t$over[,columns],hoverinfo="x+y+text",
        colorscale = overColor,
        colorbar = list(
            len = 0.3,
            y = 1,
            yanchor = 'top',
            title = 'over series',
            tickvals = ''
        )
     )
    return(p)
    })
    
    subplot(p_list[[1]],p_list[[2]],shareY = TRUE) %>%
      layout(annotations = list(
     list(x = 0.2 , y = 1.05, text = levels(Gene_states22$panel)[1], showarrow = F, xref='paper', yref='paper'),
      list(x = 0.8 , y = 1.05, text = levels(Gene_states22$panel)[2], showarrow = F, xref='paper', yref='paper'))
    )