Я пытаюсь работать над созданием графа, используя плотно. Когда пользователь нажимает на любую точку geom_point на графике, используя R блестящий, он должен изменить цвет и оставить его без изменений.
В настоящее время мой код работает нормально. Когда пользователь нажимает на любую точку geom_point на графике, она меняет цвет. Но когда я нажимаю на другую точку geom_point, предыдущая выделенная точка возвращается к исходному цвету.
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]
);
});
}"
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)
Я ожидаю, что когда пользователь нажимает на любую точку geom_point, она должна изменить цвет, и этот цвет должен оставаться до тех пор, пока он не закроет блестящее приложение. цвет не должен возвращаться к своему первоначальному цвету. Возможно, в функцию Javascript нужно внести небольшие изменения. Спасибо!
Проблема в том, что вы всегда устанавливаете все точки на основной цвет, а не проверяете, какие цвета имеют фактические точки. Я не эксперт по JavaScript, но это работает для меня:
library(shiny)
library(plotly)
library(htmlwidgets)
ui <- fluidPage(
plotlyOutput("plot")
)
javascript <- "
function(el, x){
el.on('plotly_click', function(data) {
var colors = [];
// check if color is a string or array
if(typeof data.points[0].data.marker.color == 'string'){
for (var i = 0; i < data.points[0].data.marker.color.length; i++) {
colors.push(data.points[0].data.marker.color);
}
} else {
colors = data.points[0].data.marker.color;
}
// some debugging
//console.log(data.points[0].data.marker.color)
//console.log(colors)
// set color of selected point
colors[data.points[0].pointNumber] = '#FF00FF';
Plotly.restyle(el,
{'marker':{color: colors}},
[data.points[0].curveNumber]
);
});
}
"
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)