Изменение меток цветовой панели в тепловой карте plotly (R)

#r #plotly #heatmap #colorbar

#r #plotly #тепловая карта #цветная панель

Вопрос:

Я работаю с данными опроса, где человек отвечает от «нет» до «абсолютно» в ответ на вопрос, влияет ли одна переменная на другую. Ответы отображаются в числа, и вычисляется средний ответ.

Я представляю эти средние значения в тепловой карте (x и y — это списки с одинаковыми именами переменных). Я хотел бы, чтобы цвет квадратов на тепловой карте отражал среднее числовое значение, но я хотел бы, чтобы метки на цветовой панели отражали фактический текст ответа (например, «не», «низкий», «умеренно», «высоко», «очень высоко») и ограничивали отметки позициями 0,1,2,3,4.

Я не уверен, что это можно сделать с помощью plotly. Я смог сделать это с помощью ggiraph, но это переходит в Shiny, и у ggiraph есть свои проблемы — в plotly у меня больше контроля над размером дисплея, и я не мог заставить ggiraph отображать достаточно большой.

Минимальный код приведен ниже, как и выходные данные.

 library(plotly)
library(tidyr)

M <- matrix(c(NA, 1,3, 2, NA, 4, 3, 0, NA), nrow = 3, ncol = 3)
names_M <- c('var1', 'var2', 'var3')


val_to_char <- function(x) {
        if(is.na(x)) {return(x)}
        else if(x < 0.5) {return('not')}
        else if(x < 1.5) {return('lowly')}
        else if(x < 2.5) {return('moderately')}
        else if(x < 3.5) {return('highly')}
        else {return('very high')}
      }
      
labels <- apply(M, c(1,2), val_to_char)

   
fig <- plot_ly()
fig <- fig %>%
  add_trace(
    type = 'heatmap',
    x = names_M, y = names_M, z = M, text = labels,
    hovertemplate = '<extra></extra> Row: %{y}</br></br>Col: %{x}</br>Avg response: %{text}'
  )

fig

  

введите описание изображения здесь

Ответ №1:

Вы могли бы использовать ggplot и ggplotly для большей гибкости. Но сначала вам нужно преобразовать ваши данные в long data.frame:

 M <- as.data.frame.matrix(matrix(c(NA, 1,3, 2, NA, 4, 3, 0, NA), nrow = 3, ncol = 3))
names(M) <- c('var1', 'var2', 'var3')


p <- M %>%
pivot_longer(.,paste0("var",1:3),names_to = "x",values_to = "z") %>%
  mutate(y = rep(paste0("var",1:3),each = 3)) %>%
  ggplot(aes(x,y,fill = z)) 
  geom_tile()  
  scale_fill_continuous(breaks = 0:4,labels = c("not","lowly","moderatly","highly","very high"))


ggplotly(p)
  

введите описание изображения здесь

Функция scale_fill_continuous позволяет вручную указывать метки для разных разрывов. У вас есть много возможностей для настройки вашего графика ggplot