使用R突出显示Sankey图中从头到尾的所有连接路径

Oma*_*ser 12 r rcharts sankey-diagram networkd3 htmlwidgets

当我点击节点以了解特定节点的整个故事时,我想强调整个路径,这里是一个例子 - http://bl.ocks.org/git-ashish/8959771.

请检查此链接,你会发现在javscript中突出显示路径的功能,但请注意,此功能不能达到我想要的效果,它突出显示与被点击的节点相关的链接以及与目标节点相关的链接.我想要的是突出显示与点击的节点相关的所有链接.

d3 Sankey - 从开始到结束突出显示所有连接的路径

这是我需要的一个例子, 在此输入图像描述 这是整个图,我需要的是,当我点击曼谷时,它突出显示与数据框中曼谷相同的所有节点,如突出显示与ClimateChange和EnergyShortage的链接,......然后突出显示基础设施和生态系统,和领导力和战略,......这就是我想要的.这是另一张图片,显示与曼谷相关的节点使用闪亮来分析它.

在此输入图像描述

这是当我在bl.ocks和链接的问题中使用highlight_node_links时会发生什么,这是错误的,并没有显示节点和曼谷之间的关系. 在此输入图像描述

以下是曼谷的数据,向您展示列如何相互关联,当您使用这些数据时,它将仅生成第二张图片.

structure(list(City = c("Bangkok", "Bangkok", "Bangkok", "Bangkok", 
"Bangkok", "Bangkok", "Bangkok", "Bangkok", "Bangkok", "Bangkok", 
"Bangkok", "Bangkok", "Bangkok", "Bangkok", "Bangkok", "Bangkok"
), ResiliencyChallenge = c("ClimateChange", "ClimateChange", 
"ClimateChange", "ClimateChange", "ClimateChange", "InfrastructureFaliure", 
"EnergyShortage", "Pollution", "Pollution", "Pollution", "TransportationSystemFailure", 
"TransportationSystemFailure", "TransportationSystemFailure", 
"TransportationSystemFailure", "TransportationSystemFailure", 
"TransportationSystemFailure"), CRI.Dimesnsion.1 = c("Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Infrastructure & Ecosystems", 
"Leadership & Strategy", "Leadership & Strategy", "Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Infrastructure & Ecosystems", 
"Infrastructure & Ecosystems", "Leadership & Strategy"), Implementation.time.frame = c("Short-term", 
"Short-term", "Short-term", "Short-term", "Short-term", "Mid-term", 
"Long-term", "Short-term", "Short-term", "Mid-term", "Mid-term", 
"Short-term", "Short-term", "Short-term", "Short-term", "Short-term"
), Goal = c("Goal13", "Goal13", "Goal13", "Goal13", "Goal13", 
"Goal12", "Goal12", "Goal11", "Goal11", "Goal11", "Goal11", "Goal11", 
"Goal11", "Goal11", "Goal11", "Goal11")), .Names = c("City", 
"ResiliencyChallenge", "CRI.Dimesnsion.1", "Implementation.time.frame", 
"Goal"), class = "data.frame", row.names = c(NA, -16L))
Run Code Online (Sandbox Code Playgroud)

Oma*_*ser 2

这个问题的实现是在这个闪亮的应用程序中。

https://setsna2.shinyapps.io/sankey-shinyforallcities/

我必须networkD3从内部进行修改,我正常安装了它,并将其复制到包含闪亮应用程序的目录中,并将包放入 R-lib 中。

我对sankeyNetwork.js绘制桑基图的函数做了一些修改。这是目录的图片,它显示了目录的结构,以到达必须sankeyNetwork.js手动更改它的位置。

请注意,我在这个问题中使用和上传的版本sankeyNetwork.js是旧的,是2年前的,所以你可以下载新版本networkD3,只需修改我接下来提到的部分。 在此输入图像描述 我改变的sankeyNetwork.js是添加

    .on('mouseover', function(node) {
        Shiny.onInputChange("node_name", node.name);
    })
Run Code Online (Sandbox Code Playgroud)

这意味着如果有人将鼠标悬停在节点上,我将通过使用将节点名称作为“node_name”变量传输到我的 R 会话Shiny.onInputChange,您可以在线阅读有关此闪亮函数的更多信息。

这是sankeyNetwork.js我曾经知道我的意思。

现在,如果有人将鼠标悬停在一个节点上,我可以获取该节点的名称并将其发送到 R,如果他移开光标,我将不会得到任何名称,这就是核心思想。

您可以点击此处查看我的闪亮应用程序的代码

您可以在这里Data0看到变量的一部分,也可以从这里看到变量。Goals

在 R 代码中,您会发现一些注释说“用于调试,请使用此代码”或代码中的注释,因此,如果您运行这些注释,您将在运行闪亮的应用程序之前了解数据的外观,以完全理解桑基图的读取方式数据及其外观。

在 R 代码中,你会发现这部分正在读取 node_namesankeyNetwork.js

        NodeName <- reactive({ 
                if(length(input$node_name)>0){return(as.character(input$node_name))}
                else{return(0)}
        })
Run Code Online (Sandbox Code Playgroud)

然后代码中的下一部分是检查是否NodeName在我的Nodes数据框中,如果存在,那么我将获取与该节点相关的所有节点,然后我将获取将这些节点彼此连接的链接 ID ,请注意链接 id0不是从 开始的1,因为 javascript 从 0 开始,而 R 从 1 开始。

现在我们有了NodeName用户悬停在其上的 以及Links与该节点相关的 ,现在我们可以制作桑基图并将其保存在 中sn,然后我删除旧的工具提示并添加一个新的。

用于onRender在使用闪亮时修改桑基图,我用它来制作突出显示功能以在运行闪亮时修改桑基图,当用户将鼠标悬停在节点上时,我将获取节点的名称,然后获取链接 ID 并搜索现有桑基图中的链接 ID 并增加其不透明度。

请注意,如果你运行该应用程序,你会收到错误,你必须将其上传到shinyapps.io上才能调试它,这就是我检查我的应用程序是否正常工作的方式,也许你可以找到另一种调试方式。