【问题标题】:Specifying the colors in a Plotly Heatmap在 Plotly 热图中指定颜色
【发布时间】:2017-12-05 07:44:08
【问题描述】:

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

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

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

【问题讨论】:

  • 欢迎来到 SO。请将鼠标悬停在 R 标签上 - 它要求 a) 最小 & b) 可重现的示例,通过该示例可以使用复制、粘贴、运行来重现您的问题。请提供一份。谢谢。
  • 啊,我没看到 - 这里还是很新。
  • 仅供参考。我刚看完这篇文章,您没有提供最小可重复示例的原因是我没有给予支持。我想回答你问题的人也是这么想的

标签: r plotly r-plotly


【解决方案1】:

我遇到了完全相同的问题,我设法通过一些小技巧解决了这个问题。这个问题似乎与发布答案最相关。就目前而言,Plotly 不会让您明确地这样做,即为分类(离散)热图值指定确切的颜色。这记录在this 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 不需要有列名。

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 = ''
    )
)

【讨论】:

    【解决方案2】:

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

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

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

    colorscaledefined 就归一化值而言,所以在这种情况下可以简单地做:

    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
      )
    

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 2021-01-11
      • 2021-02-22
      • 2022-09-25
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多