У меня была точно такая же проблема, и мне удалось решить ее с помощью нескольких небольших хаков. Этот вопрос кажется наиболее актуальным для публикации ответа. На данный момент Plotly не позволяет вам делать это явно, то есть указывать точные цвета для категориальных (дискретных) значений тепловой карты. Это описано в этой проблеме на github. Там связано чистое JS-решение, и мне потребовалось время, чтобы воспроизвести его в R (используя Plotly 4.7.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 = ''
)
)
person
Mikolaj
schedule
12.02.2018