J Mason
J Mason

Reputation: 27

getting colour scale gradient to work with ggplot converted to ggplotly

I'm not able to correctly draw a colour aesthetic line in plotly, using a ggplot object. What am I missing?

library(ggplot2)
library(plotly)



df <- data.frame(val = as.numeric(LakeHuron), idx = 1:length(LakeHuron))


p <- ggplot(df, aes(x = idx, y = val, colour = val)) + geom_line()
p <- p + scale_color_gradient2(low="red", mid = "gold", high="green", midpoint = mean(df$val))

p


p2 <- ggplotly(p)
p2

p prints the correct expected output.

When I print the plotly object p2, I dont get the line points joining correctly?

The problem is when i add the colour aesthetic I think.

Versions: plotly 4.9, ggplot2 3.1.1

Upvotes: 1

Views: 241

Answers (1)

Jon Spring
Jon Spring

Reputation: 66500

This is due to a limitation / difference in how plotly works vs. ggplot. Looks like there's an open issue here updated August 2018 suggesting it's not possible within the same structure ggplot uses -- a single series in plotly can't currently have varying color. ("We don't allow per-segment coloring on line traces")

But fear not! We could construct the plot a little differently using geom_segment to specify each part of the line as a separate segment. This structure is a separate object for each segment and will convert over to plotly fine:

df <- data.frame(val = as.numeric(LakeHuron), idx = 1:length(LakeHuron))
p_seg <- ggplot(df, aes(x = idx, y = val, 
                    xend = lead(idx), yend = lead(val), 
                    colour = val)) + 
  geom_segment()
p_seg <- p_seg + scale_color_gradient2(low="red", mid = "gold", high="green", midpoint = mean(df$val))
p_seg

p2 <- ggplotly(p_seg)

enter image description here

Upvotes: 2

Related Questions