Указание цветов на графической тепловой карте

В настоящее время у меня есть тепловая карта Plotly с категориальными осями.

Тепловая карта отображает индивидуумов на графике против самих себя, причем каждая пара индивидуумов имеет целочисленное значение (z-значение, которое отображается на тепловой карте), присвоенное этой паре (это мера того, насколько чётко обособлены друг от друга). пара наших). Сейчас цвета на тепловой карте назначаются автоматически.

К сожалению, я не совсем понимаю, как указать цветовую схему для такой тепловой карты. Можно ли указать цвета, которые используются для каждого z-значения? Например, могу ли я установить 1 = синий, 2 = красный, 3 = зеленый и т. Д.?

тепловая карта


person Arun    schedule 01.07.2017    source источник
comment
Добро пожаловать в SO. Пожалуйста, наведите указатель мыши на тег R - он запрашивает а) минимальный и б) воспроизводимый пример, с помощью которого можно воссоздать вашу проблему с помощью копирования, вставки, запуска. Пожалуйста, предоставьте один. Спасибо.   -  person lukeA    schedule 01.07.2017
comment
Ах, я этого не видел - все еще довольно новое здесь.   -  person Arun    schedule 01.07.2017
comment
fyi. Я только что прочитал этот пост, и причина того, что вы не предоставили минимально воспроизводимый пример, заключается в том, что я не проголосовал за. Я думаю, что парень, который ответил на твой вопрос, думал так же   -  person 5th    schedule 28.07.2018


Ответы (2)


У меня была точно такая же проблема, и мне удалось решить ее с помощью нескольких небольших хаков. Этот вопрос кажется наиболее актуальным для публикации ответа. На данный момент 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

У меня была такая же проблема, и я попал сюда по ссылке на 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
  )
person José Luiz Ferreira    schedule 12.07.2019