当ggplot / ggplotly包含注释或形状时,散点单击到Web链接被禁用

时间:2018-08-08 01:02:13

标签: r ggplot2 shiny plotly ggplotly

我正在使用闪亮的仪表板来制作闪亮的应用程序,并试图使绘图点可点击。单击后,相关的网页应从数据集中的相关网址列中显示。

我正在使用plotly,将ggplot转换为ggplotly。

不幸的是,我的ggplot具有注释和形状,这似乎禁用了htmlwidgets :: onRender()函数。但是,当我没有添加形状和注释之类的美感时,onRender()似乎可以工作。

任何人都对我如何使下面的代码使用注释和形状有任何见解?帮助将不胜感激!

我要编码的版本:

library(plotly)
library(htmlwidgets)
library(ggplot2)

iris$url <- paste0(
  "http://google.com/#q=", 
  iris$Species
)

p <- ggplot(data = iris, aes(x = Petal.Width, y = Sepal.Length, shape = Species))+
  geom_point()+
  annotate('rect', xmin = 2, xmax = 6, ymin = 2, ymax = 6,fill="firebrick",alpha = .2)
p
p1 <- ggplotly(p)
p1

p1$x$data[[1]]$customdata <- iris$url

#pp  <- add_markers(pp, customdata = ~url)

p2 <- onRender(p1, "
                function(el, x) {
                el.on('plotly_click', function(d) {
                var url = d.points[0].customdata;
                //url
                window.open(url);
                });
                }
                ")
p2

可以用作上述基本代码的简单版本:

library(plotly)
library(htmlwidgets)
library(ggplot2)

iris$url <- paste0(
  "http://google.com/#q=", 
  iris$Species
)

p <- ggplot(data = iris, aes(x = Petal.Width, y = Sepal.Length))+
  geom_point()
p
p1 <- ggplotly(p)
p1

p1$x$data[[1]]$customdata <- iris$url

#pp  <- add_markers(pp, customdata = ~url)

p2 <- onRender(p1, "
                function(el, x) {
                el.on('plotly_click', function(d) {
                var url = d.points[0].customdata;
                //url
                window.open(url);
                });
                }
                ")
p2

1 个答案:

答案 0 :(得分:0)

您必须将链接信息添加到要链接的每个图层。 这应该起作用:

library(plotly)
library(htmlwidgets)
library(ggplot2)



p <- ggplot(data = iris, aes(x = Petal.Width, y = Sepal.Length, shape = Species))+
  geom_point()+
  annotate('rect', xmin = 2, xmax = 6, ymin = 2, ymax = 6,fill="firebrick",alpha = .2)
p
p1 <- ggplotly(p)
p1

for(i in 1:length(p1$x$data)){
  if(p1$x$data[[i]]$name %in% levels(iris$Species)){
    p1$x$data[[i]]$customdata = rep(paste0("http://google.com/#q=",
    p1$x$data[[i]]$name),length(p1$x$data[[i]]$x))
  }
}


p2 <- onRender(p1, "
                function(el, x) {
                el.on('plotly_click', function(d) {
                var url = d.points[0].customdata;
                //url
                window.open(url);
                });
                }
                ")
p2

如果名称与某个物种名称之一匹配,它只会循环遍历plotly-instance上的所有层并向相应的Google查询添加链接。