Search code examples
rplotlycolorbar

Plotly R setting the title of a continuous color legend


I'm trying to plot a 3D scatter using Plotly and R. Other than x, y and z I also would like to set the color of each point depending on a fourth variable.
I manage to set the plot correctly (the use of name = ~res is to show the value of res while hovering), but I am not able to change the name of the colorbar.
This is a mock code of what I've done:

library(tidyverse)
library(plotly)

a = seq(1,10,1)
b = seq(100,1000,100)
c = seq(1,4.9,0.4)

data = tibble(a,b,c)
data <- data %>% mutate(res = a+b+c)

layout_details <- list(xaxis = list(title = 'a [-]'),
                       yaxis = list(title = 'b [-]'),
                       zaxis = list(title = 'c [-]'),
                       coloraxis=list(colorbar=list(title=list(text='Here are the results'))))

p = plot_ly(data, x = ~a, y = ~b, z = ~c, color = ~res, type = 'scatter3d', 
            mode = 'markers', name = ~res, showlegend = FALSE, scene = 'scene1')
p <- p %>% layout(scene1 = layout_details)
p

I've noticed that a quite similar question was asked (R plotly to legend title value ignored for continuous color scatter plot), but without any answers.

Does anyone know how to solve this?
Thanks


Solution

  • You can define your colorbar inside the marker argument.

    The name argument is interfering with the colorbar therefore I moved res from the name argument to the hovertemplate and the customdata.

    Code

    p = plot_ly(data, x = ~a, y = ~b, z = ~c,
                name = "",
                scene = 'scene1',
                type = 'scatter3d', 
                mode = 'markers',
                customdata = as.list(data$res),
                hovertemplate = paste('x: %{x}',
                                      'y: %{y}',
                                      'z: %{z}',
                                      'name: %{customdata}',
                                      sep = "\n"),
                marker = list(color = ~res, 
                              colorbar = list(title = "Here are the results"),
                              colorscale='Viridis',
                              showscale = TRUE)) 
    
    p <- p %>% layout(scene1 = layout_details)
    
    p
    

    Plot enter image description here