Marre
Marre

Reputation: 93

How to write a text into plotly heat map in r?

Hello I make a heat map with plotly. The code is:

     plot_ly(z = ~df$MonetaryClass, 
        x = ~df$RecencyClass, 
        y = ~df$FrequencyClass, 
        type = "heatmap") %>% 
  colorbar(title = 'Monetary Class',
           limits = c(1,5), 
           tickmode = 'array', 
           tickvals = c(1,2,3,4,5)) %>%
  layout(title = "RFM Analyse",
         xaxis = list(title = 'Recency Class',
                      tickmode = 'array',
                      tickvals = c(1, 2,3,4,5),
                      ticktext = c(1, 2, 3, 4, 5)
         ),
         yaxis = list(title = 'Frequency Class',
                      tickmode = 'array',
                      tickvals = c(1, 2,3,4,5),
                      ticktext = c(1, 2, 3, 4, 5)
         )
  )

Here is a sample of 100 of my data frame, and the information of dput() :

     structure(list(RecencyClass = c(3, 4, 4, 3, 4, 4, 1, 4, 3, 4, 
4, 2, 1, 3, 5, 5, 2, 1, 4, 1, 3, 1, 4, 2, 2, 1, 4, 5, 2, 4, 5, 
1, 1, 1, 3, 3, 3, 4, 1, 3, 1, 3, 1, 3, 2, 5, 2, 1, 4, 1, 5, 2, 
4, 4, 2, 2, 5, 3, 1, 3, 3, 5, 2, 2, 4, 4, 2, 2, 5, 2, 2, 2, 5, 
3, 2, 1, 1, 2, 5, 2, 1, 1, 2, 1, 4, 2, 3, 2, 2, 1, 1, 2, 2, 4, 
5, 3, 5, 5, 5, 5), FrequencyClass = c(4, 5, 1, 3, 5, 5, 3, 1, 
5, 3, 1, 3, 4, 1, 3, 2, 1, 2, 5, 1, 1, 4, 3, 2, 3, 1, 4, 4, 2, 
4, 4, 5, 1, 1, 3, 4, 4, 3, 2, 4, 1, 2, 1, 2, 1, 4, 1, 1, 2, 1, 
3, 1, 3, 2, 2, 4, 2, 5, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 5, 2, 1, 
4, 5, 1, 1, 3, 1, 1, 5, 4, 4, 2, 5, 1, 4, 1, 5, 2, 1, 1, 1, 3, 
5, 5, 4, 4, 4, 3, 4, 2), MonetaryClass = c(5, 5, 3, 4, 5, 3, 
1, 2, 3, 3, 1, 2, 3, 1, 4, 3, 2, 3, 5, 2, 1, 4, 1, 3, 2, 3, 5, 
5, 3, 3, 4, 5, 1, 1, 3, 3, 5, 2, 2, 4, 4, 3, 1, 2, 1, 3, 1, 1, 
2, 4, 3, 1, 2, 4, 2, 5, 1, 5, 1, 1, 1, 3, 3, 2, 1, 5, 2, 4, 5, 
2, 1, 4, 2, 1, 3, 5, 2, 1, 5, 5, 5, 2, 4, 1, 5, 1, 5, 1, 4, 1, 
2, 1, 1, 5, 3, 5, 2, 2, 4, 3)), .Names = c("RecencyClass", "FrequencyClass", 
"MonetaryClass"), row.names = c(24908L, 34164L, 27970L, 23648L, 
35944L, 35581L, 7825L, 27857L, 26043L, 31093L, 27026L, 13607L, 
8689L, 18196L, 39464L, 37304L, 9820L, 6867L, 35361L, 4767L, 18345L, 
8840L, 29486L, 11414L, 13718L, 60L, 31892L, 41103L, 13347L, 33299L, 
41563L, 8950L, 16L, 568L, 21384L, 25256L, 24005L, 30861L, 6025L, 
25098L, 5800L, 20559L, 2362L, 20797L, 11256L, 40490L, 9163L, 
3282L, 29174L, 5965L, 38331L, 11068L, 31018L, 28535L, 11793L, 
16171L, 37278L, 25937L, 5976L, 19566L, 18754L, 37055L, 11249L, 
13414L, 27966L, 31049L, 11150L, 15701L, 42887L, 11334L, 10880L, 
16532L, 44559L, 18162L, 9545L, 7810L, 3715L, 10128L, 42163L, 
16488L, 8926L, 6416L, 17789L, 4352L, 32966L, 10045L, 26614L, 
12601L, 10906L, 3122L, 4696L, 15936L, 18048L, 34864L, 41047L, 
24615L, 41413L, 39479L, 40317L, 37389L), class = "data.frame")

It looks like this:

enter image description here

As you can see I have 25 boxes insight my matrix. Is it possible to write a self chosen text in every box ? For example on box "1" Frequency and "1" Recency the blue-black one on the bottom left corner something like " I like beer". Or on "5" and "5" the yellow one in the upper right corner,something like "I like CSGO". I tried it with text but it don't work for me.

Upvotes: 4

Views: 4715

Answers (3)

Bastian
Bastian

Reputation: 630

When creating a plot of type=heatmap, you can supply it a texttemplate parameter which defines what text is shown in each field.

This method is useful for those who are looking to write text to each field, based on data already present in their dataset. In the below example I'm mapping the z value to text and displaying the first decimal ("0.0") of the value.

plot_ly(z = ~df$MonetaryClass, 
    x = ~df$RecencyClass, 
    y = ~df$FrequencyClass, 
    type = "heatmap",
    texttemplate = "%{z:.1f}"
)

Read more about the texttemplate parameter here: https://plotly.com/r/reference/heatmap/

Upvotes: 1

Sandipan Dey
Sandipan Dey

Reputation: 23109

First define the 5x5 text matrix, then add it to the data frame and then use add_annotations:

txt <- matrix(LETTERS[1:25], nrow=5) # define your 5x5 text matrix
df$txt <- txt[as.matrix(df[,1:2])]
library(plotly)
plot_ly(z = ~df$MonetaryClass, 
        x = ~df$RecencyClass, 
        y = ~df$FrequencyClass, 
        type = "heatmap") %>% 
  colorbar(title = 'Monetary Class',
           limits = c(1,5), 
           tickmode = 'array', 
           tickvals = c(1,2,3,4,5)) %>%
  layout(title = "RFM Analyse",
         xaxis = list(title = 'Recency Class',
                      tickmode = 'array',
                      tickvals = c(1, 2,3,4,5),
                      ticktext = c(1, 2, 3, 4, 5)
         ),
         yaxis = list(title = 'Frequency Class',
                      tickmode = 'array',
                      tickvals = c(1, 2,3,4,5),
                      ticktext = c(1, 2, 3, 4, 5)
         )
  ) %>%
  add_annotations(x = df$RecencyClass,
                  y = df$FrequencyClass,
                  text = df$txt, 
                  showarrow = FALSE,
                  ax = 20,
                  ay = -20)

enter image description here

Upvotes: 4

Maximilian Peters
Maximilian Peters

Reputation: 31689

You could add the text via add_annotations.

  • Specify the x and y coordinates (in the example below relative to x and y-axis via xref = 'x' and yref = 'y')
  • Add the text via text
  • Remove the default arrow with showarrow = FALSE

enter image description here

anno_x <- c(1, 5)
anno_y <- c(1, 5)
anno_text <- c('I like beer', 'I like CSGO')

p <- plot_ly(
  x = c(1:5), 
  y = c(1:5),
  z = matrix(rnorm(9), nrow = 5, ncol = 5),
  type='heatmap') %>% add_annotations(x = anno_x, y = anno_y, text = anno_text, xref = 'x', yref = 'y', showarrow = FALSE, font=list(color='black'))

p

Upvotes: 3

Related Questions