Диагональные аннотации в категориальной тепловой карте Плотли - PullRequest
0 голосов
/ 09 мая 2018

Рассмотрим следующий фрагмент R для визуализации тепловой карты с категориальными осями:

library(plotly)

x <- c("Blue", "Red")
y <- c("One", "Two")

plot_ly(x = x, y = y, z = c(1:4)) %>%
    add_heatmap(
        opacity = 0.9
    ) %>%
    add_annotations(
        text = c(1:4),
        showarrow = FALSE
    )

Это дает следующую тепловую карту: enter image description here

Аннотации распределены по диагонали и неравномерно, начиная с левой нижней ячейки. 1 и 3 находятся в нижней левой ячейке, а 2 и 4 - в верхнем правом. Почему это? Как должен быть структурирован мой текст аннотации, чтобы упорядочивать его более интуитивно (по горизонтали или по вертикали)?

1 Ответ

0 голосов
/ 10 мая 2018

Я могу только размышлять о проблеме, но на представленном изображении вы можете видеть, что Plotly использовал только два значения из 4-х z-значений. Ваша шкала цветов справа изменяется от 1 до 2, а не от 1 до 4. Это происходит, скорее всего, потому что вы указали только два значения x и y.

  • Использовать фрейм данных

    df <- expand.grid(x, y)
    df <- transform(df, text = paste(Var1, Var2, sep='_'))
    
    print(df)
    
    Var1 Var2     text
    1 Blue  One Blue_One
    2  Red  One  Red_One
    3 Blue  Two Blue_Two
    4  Red  Two  Red_Two
    
  • Теперь вы можете легко использовать add_annotations

    add_annotations(x = df$Var1,
                    y = df$Var2,
                    text = df$text)
    

Чтобы получить следующий участок enter image description here

Полный код

library(plotly)

x <- c("Blue", "Red")
y <- c("One", "Two")
df <- expand.grid(x, y)
df <- transform(df, text = paste(Var1, Var2, sep='_'))

p <- plot_ly(x = df$Var1, 
             y = df$Var2, 
             z = c(1:4)
             ) %>%
  add_heatmap(opacity = 0.9
              ) %>% 
  add_annotations(x = df$Var1,
                  y = df$Var2,
                  text = df$text)

p

В качестве альтернативы вы можете зациклить свои значения и добавить аннотацию для каждого из них.

library(plotly)

x <- c("Blue", "Red")
y <- c("One", "Two")

p <- plot_ly(x = x, 
             y = y, 
             z = c(1:4)
             ) %>%
  add_heatmap(opacity = 0.9)

for (val_x in x)
{
  for (val_y in y)
  {
    p <- add_annotations(p, 
                         x = val_x,
                         y = val_y,
                         text = paste(val_x, val_y, sep = '_'))
  }
}

p

enter image description here

...