Overlaying subplots when using plotProxy()/plotlyProxyInvoke() in Shiny App
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:

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

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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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