gpt4 book ai didi

r - 单击 ggplot/plotly 图表打开超链接

转载 作者:行者123 更新时间:2023-12-03 16:24:54 24 4
gpt4 key购买 nike

这是对为 Add onclick open hyperlink event to an html widget created in R 提供的答案的后续问题.考虑以下示例:

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

这按预期工作 - 单击任意点可打开相应的 url:
f(ggplot(myData, aes(x=x, y=y)) + geom_point(aes(text=label)))

enter image description here

这不能按预期工作 - 索引不再匹配:
f(ggplot(myData, aes(x=x, y=y)) + geom_point(aes(text=label, color=category)))

enter image description here

plotly 对象不同,似乎 pointNumber不再保存所有点的绝对索引,而是保存(颜色)分组内的索引。

关于如何调整示例以使其适用于带有颜色/填充分组的一般用例的任何想法?

最佳答案

  • plotly_click event 提供数据跟踪的名称。
  • data是点击事件信息
  • data.points[0].data.name是跟踪/类别名称

  • 我们可以通过 category 来分割它,而不是传递扁平的数据框。 (就像 aes 一样)并传入我们的 JavaScript 函数
    var urls = ", toJSON(split(myData, myData$category)), ";

    这给了我们以下 JSON
    {"other": [{"x":3,"y":1,"label":"R","category":"other","urls":"http://r-project.org"}],
    "search":[{"x":1,"y":3,"label":"Google","category":"search","urls":"http://google.de"},
    {"x":2,"y":2,"label":"Bing","category":"search","urls":"http://bing.com"}]
    }
    然后通过以下方式检索该 URL
    window.open(urls[data.points[0].data.name][data.points[0].pointNumber]['urls'],'_blank');

    即从提供的 JSON:我们从点击的第一个(也是唯一一个)点 ( data.points[0] ) 获取跟踪的名称 ( data.name ) 及其 pointNumber (即跟踪中的第 n 个点)。

    完整代码
    library(ggplot2)
    library(plotly)
    library(htmlwidgets)
    library(htmltools)
    library(jsonlite)

    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.getElementsByClassName('js-plotly-plot')[0];
    myPlot.on('plotly_click', function(data){
    var urls = ", toJSON(split(myData, myData$category)), ";
    window.open(urls[data.points[0].data.name][data.points[0].pointNumber]['urls'],'_blank');
    });", sep=''))
    prependContent(ply, onStaticRenderComplete(javascript))
    }

    f(ggplot(myData, aes(x=x, y=y)) + geom_point(aes(text=label, color=category)))

    关于r - 单击 ggplot/plotly 图表打开超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711131/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com