离散的色条在R的Plotly中

6

我正在尝试用R plotly生成热力图。以下是可复制的示例:

test <- structure(list(s1 = c(0L, 0L, 1L, 0L, 1L, 1L), s2 = c(1L, 1L, 
0L, 1L, 0L, 0L), s3 = c(0L, 0L, 0L, 0L, 0L, 0L), s4 = c(0L, 0L, 
0L, 0L, 0L, 0L), s5 = c(0L, 0L, 0L, 0L, 0L, 0L), s6 = c(0L, 0L, 
0L, 0L, 0L, 0L)), .Names = c("s1", "s2", "s3", "s4", "s5", "s6"
), row.names = c("5HT2 type receptor mediated signaling pathway", 
"5HT3 type receptor mediated signaling pathway", "5-Hydroxytryptamine degredation", 
"Alpha adrenergic receptor signaling pathway", "Alzheimer disease-amyloid secretase pathway", 
"Angiogenesis"), class = "data.frame")

以下是使用plotly生成热力图的代码:

f1 <- list(
    family = "Arial, sans-serif",
    size = 5,
    color = "lightgrey")

f2 <- list(
    family = "Old Standard TT, serif",
    size = 10,
    color = "black")

a <- list(
  title = "",
  titlefont = f1,
  showticklabels = TRUE,
  tickangle = 45,
  tickfont = f2,
  exponentformat = "E")

plot_ly(z = as.matrix(test), 
        zmin=0, 
        zmax=1,
        x = colnames(test), 
        xgap = 2, 
        y = rownames(test), 
        ygap =2, 
        type = "heatmap", 
        colorbar=list(ypad = 30, tickmode="array", tickvals = c(0,1), color = 2, autocolorscale = F )) %>% 
  layout(xaxis = a,
         margin = list(l =500, r = 10, b = 200, t = 10))

正如您所看到的,生成的图表具有连续的比例尺。我发现这个StackOverflow问题,其中作者提出了类似的问题。我尝试复制答案中提供的解决方案,但是我无法找到解决方法。请问怎样将颜色比例尺设置为离散的而不是连续的?

谢谢

编辑1:添加了“a”变量定义


请在layout(xaxis = a, ...中定义变量a - Marco Sandri
@MarcoSandri在主要问题中添加了内容,感谢您指出! - user324810
2个回答

10

您需要按照以下方式定义颜色比例尺:

colorScale <- data.frame(z=c(0,0.5,0.5,1),col=c("#440053","#440053","#FDE624","#FDE624"))
colorScale$col <- as.character(colorScale$col)

plot_ly(z = as.matrix(test), 
        x = colnames(test), 
        xgap = 2, 
        y = rownames(test), 
        ygap =2, 
        type = "heatmap", 
        colorscale=colorScale ,
        colorbar=list(ypad = 30, tickvals=c(0.25,0.75), ticktext=c(0,1))) %>% 
  layout(xaxis = a,
         margin = list(l =500, r = 10, b = 200, t = 10))

enter image description here


谢谢你的回答!你能否详细解释一下你的答案,这样我就能理解你做了什么?谢谢! - user324810
3
一个颜色刻度是由一个数字列和一个字符列组成的数据框。数字列定义了值范围,字符列定义了相应范围的颜色。我定义了两个范围:从0到0.5使用紫色,从0.5到1使用黄色。定义好的颜色刻度应该通过plot_ly中的colorscale参数传递。 - Marco Sandri

4

Macro Sandris 的回答非常完美,而且效果惊人。

我只想补充一点,如果你需要超过两个类别,可以使用以下示例:

2个类别(请参阅Marcos的答案)

colorScale <- data.frame(z=c(0,0.5,0.5,1),col=c("#440053","#440053","#FDE624","#FDE624"))

3个类别

colorScale <- data.frame(z=c(0,0.33,0.33,0.66,0.66,1),col=c("#440053","#440053","#FDE624","#FDE624","#DDE431","#DDE431"))

等等。确保传入数据框的向量始终在0到1的范围内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接