plotly / plotly/plotly.R

add_text() interferes with plot's color animation

Open
#1,865 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
R
Stars
2.7k
Forks
641
PR merge metrics
No merged PRs in 30d

Description

I have a gauge plot (following this tutorial), with the color of the plot changing according to the current value. I also want an annotation* which displays the current value of the gauge (I don't want the standard value displayed in the sector).

I tried the following:

library(plotly)
library(RColorBrewer)

riskToHex <- function(x) {
  x <- colorRamp(rev(brewer.pal(11, "RdYlBu")))(x / 100)
  rgb <- paste(x[,1], x[,2], x[,3], sep = ",")
  paste0("rgb(", rgb, ")")
}

dd <- data.frame(values = c(90, 60, 20))

dd <- dd %>%
  mutate(colors = riskToHex(dd$values),
         frame = seq.int(nrow(dd)))
dd <- merge(dd, data.frame(values = 200 - dd$values,
                           colors = "white",
                           frame = dd$frame),
            all = TRUE) %>%
  arrange(frame)

plot_ly() %>%
  add_pie(values = dd$values,
          frame = dd$frame,
          rotation = -90,
          marker = list(colors = dd$colors),
          textinfo = "none",
          title = list(text = "Risk score",
                       font = list(size = 20)),
          hoverinfo = "skip",
          sort = FALSE,
          showlegend = FALSE,
          order = "clockwise",
          hole = 0.6) %>%
  add_markers(x = 0,
             y = c(0, 1),
             color = 'rgba(0,0,0,1)') %>%
  add_text(x = 0,
           y = 0.6,
           yshift = 100,
           text = filter(dd, colors != "white")$values,
           frame = distinct(dd, frame)[[1]],
           showlegend = FALSE,
           textfont = list(size = 20)) %>%
  animation_opts(frame = 500) %>%
  layout(
    xaxis = list(showgrid = FALSE,
                 zeroline = FALSE,
                 showticklabels = FALSE
                 ),
    yaxis = list(showgrid = FALSE,
                 zeroline = FALSE,
                 showticklabels = FALSE
    )
  )

This is rather messy and very hacky. I had to use add_text() because I couldn't figure out how to get annotations to work in this case with changing values in each frame (whether through add_annotations or layout(annotations = ...)). Unfortunately, the add_text() forced me to add the layout block disabling the axes (which otherwise start to appear). And since the pie chart is seemingly printed on paper space, I also had to add two invisible points so that I could actually position the text (otherwise the axes would always keep the text centered).

Regardless, this successfully generates an animated chart. However, the color only seems to change to the correct value on the following frame (by which time it's too late).

enter image description here

Howeverf, this only happens due to the add_text() block. If I comment that out, the colors on the bar work correctly.

enter image description here

Is there any explanation and solution to this?


* I'm open to other solutions!

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reproducible R example in the issue and compare the animation with and without add_text(). Investigate why the pie colors lag when text is present; done means the gauge color and displayed value update on the same frame without requiring the axis workaround.

Written by the indexing model from the issue text.

Assessment

Tech stack
r
Domain
data-visualization
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.