This is a follow up question on the answer provided for Add onclick open hyperlink event to an html widget created in R. Consider the following example:
library(ggplot2)
library(plotly)
library(htmlwidgets)
library(htmltools)
myData <- data.frame(
x=c(1,2,3),
y=c(3,2,1),
label=c("Google", "Bing", "R"),
category=c("search", "search", "other"),
urls=c("http://google.de", "http://bing.com", "http://r-project.org")
)
f <- function(p) {
ply <- ggplotly(p)
javascript <- HTML(paste("
var myPlot = document.getElementById('", ply$elementId, "');
myPlot.on('plotly_click', function(data){
var urls = ['", paste(myData$urls, collapse = "', '"), "'];
window.open(urls[data.points[0].pointNumber],'_blank');
});", sep=''))
prependContent(ply, onStaticRenderComplete(javascript))
}
This works as expected - a click on any point opens the corresponding url:
f(ggplot(myData, aes(x=x, y=y)) + geom_point(aes(text=label)))
This does not work as expected - the indices do not match anymore:
f(ggplot(myData, aes(x=x, y=y)) + geom_point(aes(text=label, color=category)))
The plotly objects differ and it seems as if pointNumber
does not hold the absolute index of all points any more, but the index within a (color) grouping.
Any ideas on how to adapt the example so that it works for general use cases also with color/fill groupings?
plotly_click
event provides the name of the data trace.data
is the click event informationdata.points[0].data.name
is the trace/category nameInstead of passing the flattened data frame we can split it by
category
(just likeaes
does) and pass into our JavaScript functionWhich gives us the following JSON
The URL is then retrieved by
i.e. from the provided JSON: we take from the first (and only) point which was clicked on (
data.points[0]
) the name of the trace (data.name
) and itspointNumber
(i.e. the n-th point in the trace).Complete code