2

我目前有一个带有分类轴的 Plotly 热图。

热图将图表中的个体与他们自己进行对比,每对个体都有一个整数值(z 值,这是热图上绘制的值)分配给该对(它是衡量两个个体之间的公平程度的量度)。配对我们的)。现在,热图上的颜色是自动分配的。

不幸的是,我不太清楚如何为这样的热图指定配色方案。是否可以指定用于每个 z 值的颜色?例如,我可以设置 1 = 蓝色、2 = 红色、3 = 绿色等吗?

热图

4

2 回答 2

3

我遇到了完全相同的问题,我设法通过一些小技巧解决了这个问题。这个问题似乎与发布答案最相关。就目前而言,Plotly 不会让您明确地这样做,即为分类(离散)热图值指定确切的颜色。这记录在这个github 问题中。那里链接了一个纯 JS 解决方案,我花了一段时间在 R 中重现它(使用 Plotly 4.7.1)。

首先,不是一个矩阵包含所有数据,而是每个类别需要一个矩阵,每个矩阵都填充有 1 和 NA。每个矩阵的大小必须相同。让我们弥补一些数据。

greenSeriesData <- matrix(c(1,1,NA,NA,1,NA,NA,NA,1), nrow = 3)
redSeriesData <- matrix(c(NA,NA,1,1,NA,NA,NA,NA,NA), nrow = 3)
blueSeriesData <- matrix(c(NA,NA,NA,NA,NA,1,1,1,NA), nrow = 3)

然后对于每个类别,您需要有一个单独的 data.frame 为给定类别保存颜色。重要的是那些 data.frames 不需要有 colnames。

greenColor <- data.frame(x = c(0,1), y = c("#63a803", "#63a803"))
colnames(greenColor) <- NULL

redColor <- data.frame(x = c(0,1), y = c("#a80b03", "#a80b03"))
colnames(redColor) <- NULL

blueColor <- data.frame(x = c(0,1), y = c("#035da8", "#035da8"))
colnames(blueColor) <- NULL

您已准备好将每个类别指定为单独的跟踪:

plot_ly(
    type = "heatmap"
) %>% add_trace(
    z = greenSeriesData,
    colorscale = greenColor
) %>% add_trace(
    z = redSeriesData,
    colorscale = redColor
) %>% add_trace(
    z = blueSeriesData,
    colorscale = blueColor
)

如果您想进一步调整图例以使其看起来不错,则需要colorbar为每个跟踪添加一个参数:

plot_ly(
    type = "heatmap"
) %>% add_trace(
    z = greenSeriesData,
    colorscale = greenColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Green series',
        tickvals = ''
    )
) %>% add_trace(
    z = redSeriesData,
    colorscale = redColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Red series',
        tickvals = ''
    )
) %>% add_trace(
    z = blueSeriesData,
    colorscale = blueColor,
    colorbar = list(
        len = 0.3,
        y = 1,
        yanchor = 'top',
        title = 'Blue series',
        tickvals = ''
    )
)
于 2018-02-12T18:52:01.367 回答
1

我有同样的问题,并通过 Mikolaj 提到的 github 链接到达这里。对我有用的第二种简化方法是colorscale手动定义并去掉图例(可以手动绘制)。

为了简单起见,让我们采取三个类别(颜色)。

colors <- RColorBrewer::brewer.pal(3, 'Set2')

colorscale是针对标准化值定义的,因此在这种情况下可以简单地执行以下操作:

colorscale <- list(
  list(0, colors[1]),
  list(0.5, colors[2]),
  list(1, colors[3])
) 

这可以概括为将嵌套列表中的第一个值定义为的 N 颜色(i - 1)/(N - 1),其中 i 是相应的color索引。

例如:

plot_ly() %>%
  add_trace(
    type = "heatmap",
    data = mtcars %>% 
      group_by(cyl, gear) %>% 
      summarise(n = n()) %>% 
      mutate(cat = 1 + (n > 1) + (n > 10)),
    x = ~cyl,
    y = ~gear,
    z = ~cat,
    colorscale = colorscale,
    showscale = FALSE
  )
于 2019-07-12T13:22:54.510 回答