2017-08-27 1 views
4

Ich arbeite an einem verknüpften Plot (ähnlich wie The SharedData plot pipeline von Carson Sievert in Plot für R. Das Plot zeigt eine Legende für einen Gegenstand, über den ich gerade schwebe. Allerdings zeigt die Legende gerade zwei Elemente, eine für das Balkendiagramm und ein für das Liniendiagramm.Filterlegende in verknüpften Ansichten mit plotly

  • Wie kann ich das erste Legende Element (das rote Quadrat für das Balkendiagramm) lösche und nur die Legende für das Liniendiagramm (rote Linie) halte ?

Hier aktuelle Code:

library(ggplot2) 
library(crosstalk) 
library(plotly) 

sd <- SharedData$new(txhousing, ~city) 

base <- plot_ly(sd, color = I("black")) %>% 
     group_by(city) %>% 
     layout(showlegend = TRUE) 

p1 <- base %>% 
     summarise(has = sum(is.na(median))) %>% 
     filter(has > 0) %>% 
     arrange(has) %>% 
     add_bars(x = ~has, y = ~factor(city, levels = city), 
     hoverinfo = "none", showlegend = FALSE) %>% 
     layout(
     barmode = "overlay", 
     xaxis = list(title = "Number of months missing"), 
     yaxis = list(title = "") 
    ) 

p2 <- base %>% 
    add_lines(x = ~date, y = ~median, alpha = 0.3, showlegend = FALSE) %>% 
    layout(xaxis = list(title = "")) 

gp <- subplot(p1, p2, titleX = TRUE, widths = c(0.3, 0.7)) %>% 
    layout(margin = list(l = 120)) %>% 
    highlight(color = "red", 
     defaultValues = "Victoria", 
     selected = attrs_selected(showlegend = TRUE, mode = "lines" 
    )) 

gp 

Es wurde irgendwo erwähnt, dass das letzte Entfernen des Legendenelements funktionieren könnte, aber es funktioniert nicht für mich hier.

gp$x$data[[1]]$showlegend <- FALSE 
+0

Soweit ich weiß, Sie können das direkt in Plotly nicht. Sie könnten jedoch Javascript-Code zu Ihrem Grundstück hinzufügen, um sich um das zu kümmern, was Sie brauchen. –

Antwort

2

Wenn Plotly uns nicht sehen ein Verfahren Legenden von highlight erstellt verstecken, dann lassen Sie uns Plotly eigene Funktionen verwenden, dies zu tun.

Javascript-Code, der die Spur zu verbergen einmal gebraucht wird:

var updated = {showlegend: false}; 
var myPlot = document.getElementsByClassName('plotly')[0]; 
Plotly.restyle(myPlot, updated, [2]); 

In diesem Fall ist es immer das dritte Element [2] die versteckt seine Legende braucht im Allgemeinen wäre es vorzuziehen, den Index dynamisch zu bekommen basierend auf einigen Bedingungen.

Fügen wir das zu Plotlys on_click Ereignis hinzu, um sicherzustellen, dass die Legende auch in Zukunft unsichtbar bleibt.

myPlot.on('plotly_click', function(data){ 
    Plotly.restyle(myPlot, updated, [2]); 
}); 

Und schließlich fügen Sie alles zur Ausgabe hinzu und wir sind gut.

javascript <- " 
var updated = {showlegend: false}; 
var myPlot = document.getElementsByClassName('plotly')[0]; 
Plotly.restyle(myPlot, updated, [2]); 
myPlot.on('plotly_click', function(data){ 
    Plotly.restyle(myPlot, updated, [2]); 
}); 
" 

w <- plotly::as_widget(gp) 
w <- htmlwidgets::prependContent(w, onStaticRenderComplete(javascript), data=list('')) 
htmlwidgets::saveWidget(w, "cities.html") 
w 

enter image description here