如何使用ggplotly-R

时间:2018-08-03 23:13:14

标签: r shiny r-plotly htmlwidgets ggplotly

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

任何人都知道如何使用下面的代码来完成这项工作吗?在代码的OnRender部分(不熟悉javascript)是否可以找到解决方案? 使用plotly的第一个代码块有效。第二个代码块是我使用ggplotly进行此操作的基本尝试,但不起作用。

任何有关此的指导都将是惊人的!预先感谢

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

#1. Using plotly
mtcars$url <- paste0(
  "http://google.com/#q=", 
  rownames(mtcars))
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);
         });
         }
         ")

2 个答案:

答案 0 :(得分:3)

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);
         });
         }
         ")

答案 1 :(得分:1)

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

mtcars$url <- paste0("http://google.com/#q=", 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);
     });
     }
     ")