如何使用ggplotly - R使散点图点打开超链接

How to make scatterplot points open a hyperlink using ggplotly - R

我想让我的散点图点可点击,并在点击时打开每个点各自的超链接。我正在尝试使用 ggplotly 来做到这一点。 在使用 plotly() 构建绘图时,有一种简单的方法可以做到这一点(请参见下面的第一个示例)。但是,当 运行 它在 ggplotly 上时,单击时会打开一个空网页。

任何人都知道我如何使用下面的代码使它工作?代码的OnRender部分是否有解决方案(不熟悉javascript)? 使用 plotly 的第一个代码块有效。第二个代码块是我使用 ggplotly 进行的基本尝试,但它不起作用。

任何关于这方面的指导都会很棒!提前致谢

library(plotly)
library(htmlwidgets)
library(dplyr)

mtcars$url <- paste0("http://google.com/search?q=", gsub(" ", "+", rownames(mtcars)))

#1. Using plotly
p <- plot_ly(mtcars, x = ~wt, y = ~mpg) %>%
  add_markers(customdata = ~url)
onRender(p, "
         function(el, x) {
         el.on('plotly_click', function(d) {
         var url = d.points[0].customdata;
         window.open(url);
         });
         }
         ")

#2. Using ggplotly`
p <- ggplot(data = mtcars, aes(x = wt, y = mpg))+
  geom_point()
pp <- ggplotly(p)
pp  <- add_markers(pp, customdata = ~url)
onRender(pp, "
         function(el, x) {
         el.on('plotly_click', function(d) {
         var url = d.points[0].customdata;
         url
         window.open(url);
         });
         }
         ")

看起来add_markers(pp, customdata = ~url)没有效果。这是通过做:

p <- ggplot(data = mtcars, aes(x = wt, y = mpg)) + geom_point()
pp <- ggplotly(p)
pp$x$data[[1]]$customdata <- mtcars$url
#pp  <- add_markers(pp, customdata = ~url)
ppp <- onRender(pp, "
         function(el, x) {
         el.on('plotly_click', function(d) {
         var url = d.points[0].customdata;
         //url
         window.open(url);
         });
         }
         ")

这是 Stéphane 解决方案的更通用版本,在使用组、颜色、方面等时不起作用。如果您直接在 customdata 中指定 url,一切都很好审美:

mtcars$url <- paste0("http://google.com/search?q=", gsub(" ", "+", rownames(mtcars)))

p <- ggplot(data = mtcars, aes(x = wt, y = mpg, color = as.character(carb), customdata = url)) + 
geom_point() + 
facet_wrap(~cyl)
pp <- ggplotly(p)
ppp <- htmlwidgets::onRender(pp, "
     function(el, x) {
     el.on('plotly_click', function(d) {
     var url = d.points[0].customdata;
     //url
     window.open(url);
     });
     }
     ")