2017-08-27 49 views
4

我正在一個鏈接的陰謀(類似於卡爾森Sievert的The SharedData plot pipeline在情節爲R.該圖顯示了我目前懸停的一個項目的傳說。但是,現在圖例顯示兩個元素,一個用於條形圖和一個用於折線圖。過濾圖例鏈接的意見與情節

  • 如何刪除第一個傳說元素(紅色正方形的柱狀圖),只保留了折線圖的圖例(紅線) ?

這裏是當前代碼:

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 

有人在某處說過,傳說元素的最終刪除可能有效,但它在這裏並不適合我。

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

據我知道你不能這樣做,直接在Plotly。但是,您可以將JavaScript代碼添加到您的情節,以照顧您的需要。 –

回答

2

如果Plotly沒有爲我們來隱藏highlight創造傳奇的方法,再拿Plotly自己的功能這樣做。

這是需要隱藏的痕跡,一旦

Javascript代碼:

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

在這種情況下,它始終是第三個元素[2]這就需要它的傳說隱藏的,一般最好將得到指數動態基於一些條件。

讓我們將此添加到Plotly的on_click事件中,以確保圖例在將來也不可見。

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

最後將所有內容添加到輸出中,我們很好。

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