我遇到了完全相同的问题,我设法通过一些小技巧解决了这个问题。这个问题似乎与发布答案最相关。就目前而言,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 = ''
)
)