你可以Plotly
的events你閃亮的應用與htmlwidget
'加s onrender
功能。
ggplotly(p) %>% onRender(javascript)
的colors
數組傳遞到restyle
功能。選定的點(pointNumber
)是彩色洋紅色,而其他點則從圖例中獲取顏色。你可以用大小做同樣的事情,標記符號有點棘手,因爲Plotly
在這裏不接受數組。
function(el, x){
el.on('plotly_click', function(data) {
colors = [];
var base_color = document.getElementsByClassName('legendpoints')[data.points[0].curveNumber].getElementsByTagName('path')[0].style['stroke']
for (var i = 0; i < data.points[0].data.x.length; i += 1) {
colors.push(base_color)
};
colors[data.points[0].pointNumber] = '#FF00FF';
Plotly.restyle(el,
{'marker':{color: colors}},
[data.points[0].curveNumber]
);
});
}
library(shiny)
library(plotly)
library(htmlwidgets)
ui <- fluidPage(
plotlyOutput("plot")
)
javascript <- "
function(el, x){
el.on('plotly_click', function(data) {
colors = [];
var base_color = document.getElementsByClassName('legendpoints')[data.points[0].curveNumber].getElementsByTagName('path')[0].style['stroke']
for (var i = 0; i < data.points[0].data.x.length; i += 1) {
colors.push(base_color)
};
colors[data.points[0].pointNumber] = '#FF00FF';
Plotly.restyle(el,
{'marker':{color: colors}},
[data.points[0].curveNumber]
);
//make sure all the other traces get back their original color
for (i = 0; i < document.getElementsByClassName('plotly')[0].data.length; i += 1) {
if (i != data.points[0].curveNumber) {
colors = [];
base_color = document.getElementsByClassName('legendpoints')[i].getElementsByTagName('path')[0].style['stroke'];
for (var p = 0; p < document.getElementsByClassName('plotly')[0].data[i].x.length; p += 1) {
colors.push(base_color);
}
Plotly.restyle(el,
{'marker':{color: colors}},
[i]);
}
};
});
}"
server <- function(input, output, session) {
nms <- row.names(mtcars)
output$plot <- renderPlotly({
p <- ggplot(mtcars, aes(x = mpg, y = wt, col = as.factor(cyl), key = nms)) +
geom_point()
ggplotly(p) %>% onRender(javascript)
})
}
shinyApp(ui, server)
幾點說明:
- Plotly的事件,例如在事件功能
data.points
包含該事件被觸發在這種情況下
- 點
plotly_click
傳遞(在這種情況下data
)的一些信息,我們只有一個點data.points[0]
其中pointNumber
是原始數組的索引和curveNumber
是跟蹤號碼。
- Plotly賣場裏的情節繪製
- 我們可以通過
document.getElementsByClassName('plotly')[0].data
- 傳說可以通過
document.getElementsByClassName('legendpoints')[i]
其中i
訪問訪問它在div
所有輸入數據是傳說
- 的指數ggplotly或plot_ly返回htmlwidgets
- Javascript或HTML代碼可以添加任何htmlwidget functions,例如
onrender
在這種情況下
有一個可能相關的問題([在有光澤的動態ggplot層用nearPoints()](https://stackoverflow.com/q/40805513/3817004)),其不涉及'plotly '。 – Uwe
@Uwe謝謝,我會研究它。一個主要的觀察結果是'nearPoints()'在'ggplotly'情況下不起作用。其次,當整個繪圖再次繪製時,可能會認爲因素水平會得到新的顏色,並且難以從整個繪圖中識別選定的區域。 – Prradep