plotly / plotly/plotly.R

Overlaying subplots when using plotProxy()/plotlyProxyInvoke() in Shiny App

Offen
#2,054 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
R
Sterne
2.7k
Forks
641
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

I was hoping to extend the plotly.R "relayout" shiny example found here to incorporate a subplot of 3 figures with a range slider down the bottom. Here is what I tried:

library(shiny)
library(plotly)

ui <- fluidPage(
  plotlyOutput("plot")
  )

server <- function(input, output, session) {
  
  p <- txhousing %>%
    group_by(city) %>%
    plot_ly(
      x = ~ date,
      y = ~ median,
      mode = 'lines',
      type = 'scatter',
      source = 'myplot'
    ) %>%
    rangeslider(thickness = 0.05)
  
  output$plot <- renderPlotly({
    
    # Just duplicating plots for this example
    
    subplot(p, p, p, shareX = T, nrows = 3) %>%
      layout(height = 720)
    
  })
  
  observeEvent(event_data("plotly_relayout", source = "myplot"), {
    d <- event_data("plotly_relayout", source = "myplot")
    # unfortunately, the data structure emitted is different depending on 
    # whether the relayout is triggered from the rangeslider or the plot
    xmin <- if (length(d[["xaxis.range[0]"]])) d[["xaxis.range[0]"]] else d[["xaxis.range"]][1]
    xmax <- if (length(d[["xaxis.range[1]"]])) d[["xaxis.range[1]"]] else d[["xaxis.range"]][2]
    if (is.null(xmin) || is.null(xmax)) return(NULL)
    
    # compute the y-range based on the new x-range
    idx <- with(txhousing, xmin <= date & date <= xmax)
    yrng <- extendrange(txhousing$median[idx])
   
    plotlyProxy("plot", session) %>%
      plotlyProxyInvoke("relayout", list(yaxis = list(range = yrng)))

  })

}

shinyApp(ui, server)

Below is a preview of the plotly output before using the rangeslider:

image

And here is the resulting plotly output after I use the rangeslider:

image

I have also tried replacing:

plotlyProxy("plot", session) %>%
      plotlyProxyInvoke("relayout", list(yaxis = list(range = yrng)))

With this instead:

  plotlyProxy("plot", session) %>%
     plotlyProxyInvoke("relayout", list(yaxis = list(range = yrng), 
                                        yaxis2 = list(range = yrng),
                                        yaxis3 = list(range = yrng)))

...just in case I was able to independently control the individual y-axes of the subplot. However, this didn't work either. The
original example works great for the single plot; it is when I try adding in the subplots that things get whacky.

I was wondering if anyone else can confirm this plotting behaviour? Any suggestions for a workaround?

Thanks in advance! :)

[UPDATE]

I managed to find a workaround. The issue seemed to be that when calling the plotProxy()/plotProxyInvoke() functions the subplot domains got garbled :-S. However, if I explicitly set the domains for each y-axis (roughly breaking the vertical real-estate in thirds) in then everything displays as it should:

plotlyProxy("plot", session) %>%
      plotlyProxyInvoke("relayout", list(yaxis = list(range = yrng, domain = p$x$layout$yaxis$domain),
                                         yaxis2 = list(range = yrng, domain = p$x$layout$yaxis2$domain),
                                         yaxis3 = list(range = yrng, domain = p$x$layout$yaxis3$domain)))

where the object p is the original plot_ly obj that I am able to access on the server side.

Any idea why the calling plotProxy()/plotProxyInvoke() seems to garble the original y-axis domains? The workaround does solve the problem, just feels a bit clunky to have to do that each time the rangeslider updates.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit inst/examples/shiny/proxy_relayout/app.R und reproduziere anschließend das dreiteilige subplot-Beispiel mit subplot(), plotlyProxy() und plotlyProxyInvoke("relayout"). Untersuche, warum relayout die y-Achsenbereiche des Subplots ändert, einschließlich der Fälle yaxis, yaxis2 und yaxis3. Als erledigt gilt die Aufgabe, wenn der rangeslider die y-Bereiche aktualisiert, ohne dass Aufrufer die Domäne jeder Achse manuell wiederherstellen müssen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
r
Bereich
data-visualization
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.