0

I am trying to make an interactive heatmap in R using a combination of geom_tile and ggplotly. However, when I run the ggplotly command, the interactive heatmap I get back only has grey values. Moreover, the interactive hover only seems to work for some values in the heatmap.

Some more information about the data

The data consists of a data frame of 128 rows x 288 columns of values between 0 - 1 at 0.2 increments.

The data can be replicated using the following code:

library(magrittr)

data <- as.data.frame(matrix(data = sample(seq(0, 1, 0.2), 
                                           size = 128*288, 
                                           replace = TRUE), 
                             nrow = 128, 
                             ncol = 288))

colnames(data) <- seq(1, 288, 1)

data <- data %>%
  dplyr::mutate(y_axis = seq(1, 128, 1)) %>%
  reshape2::melt(id = "y_axis") %>%
  dplyr::rename(x_axis = "variable")

Some more information about the plotting:

I specified the color palette by first producing a color vector as follows

color_vector <- viridis::viridis(
  length(
    sort(
      unique(
        unlist(df)))),
  direction = 1,
  option = "A")

I then made the plot as follows:

plot <-
  
  ggplot2::ggplot(
    df, ggplot2::aes(x_axis,
                      y_axis,
                      fill=z_axis,
                      color=z_axis)) +
  
  ggplot2::geom_tile() +
  
  ggplot2::scale_fill_gradientn(
    colors = color_vector,
    na.value = "grey45",
    guide = ggplot2::guide_legend(
      title.position = "top",
      title.vjust = 1,
      title.hjust = 0.5,
      nrow=1,
      keywidth = grid::unit(5, "mm")),
    breaks=seq(0, 1, 0.1),
    limits = c(0, 1)) +
  
  ggplot2::scale_color_gradientn(
    colors = color_vector,
    na.value = "grey45",
    guide = ggplot2::guide_legend(
      title.position = "top",
      title.vjust = 1,
      title.hjust = 0.5,
      nrow=1,
      keywidth = grid::unit(5, "mm")),
    breaks=seq(0, 1, 0.1),
    limits = c(0, 1)) +
  
  ggplot2::guides(color='none')

Finally, I called ggplotly as follows

plotly::ggplotly(plot)

When I produce the plot without interactivity, I get the following heatmap:

enter image description here

However, when I add interactivity, I get this:

enter image description here

I'm not sure what the issue is, but I suspect it may have something to do with the scale_fill_gradientn and scale_color_gradientn functions. However, as this is part of a bigger function, I need to specify the colors this way (and it works for non-interactive plots).

I described above what I tried and provided pictures of what I expected vs what I got.

  • 3
    Thank you for trying to write a complete question. Please provide a sample of your dataset as well. You need to provide a [minimal, reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) of your data. Taking the [Tour](https://stackoverflow.com/tour) and reading [How to Ask](https://stackoverflow.com/help/how-to-ask) can be helpful as well. – M-- Mar 27 '23 at 14:45

0 Answers0