Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中单击Sankey图表行时添加附加标签值_R_Plotly_Shiny_Sankey Diagram - Fatal编程技术网

在R中单击Sankey图表行时添加附加标签值

在R中单击Sankey图表行时添加附加标签值,r,plotly,shiny,sankey-diagram,R,Plotly,Shiny,Sankey Diagram,下面的脚本创建一个sankey图表,如下面的快照所示。我的要求是,当我点击左侧和右侧节点之间的任何链接时,即“a1”和“a2”,我希望相应的“a3”的总和出现在标签中。为了便于说明,a1中的“A”和a2中的“E”一起具有值50和32。所以,我想看到82在标签上点击链接时,请帮助和感谢。与所有其他a1、a2对类似。下面服务器代码中的list()函数需要进行一些调整。正在附加快照 library(shiny) library(shinydashboard) library(plotly) libra

下面的脚本创建一个sankey图表,如下面的快照所示。我的要求是,当我点击左侧和右侧节点之间的任何链接时,即“a1”和“a2”,我希望相应的“a3”的总和出现在标签中。为了便于说明,a1中的“A”和a2中的“E”一起具有值50和32。所以,我想看到82在标签上点击链接时,请帮助和感谢。与所有其他a1、a2对类似。下面服务器代码中的list()函数需要进行一些调整。正在附加快照

library(shiny)
library(shinydashboard)
library(plotly)
library(DT)
library(dplyr)
a1 = c("A","B","C","A","C","C","B")
a2 = c("E","F","G","E","G","G","F")
a3 = c(50,45,64,32,45,65,75)
a12 = data.frame(a1,a2,a3,stringsAsFactors = FALSE)
a12$a1 = as.character(a12$a1)
a12$a2 = as.character(a12$a2)
ui <- dashboardPage(
dashboardHeader(title = "Sankey Chart"),
dashboardSidebar(
width = 0
),
dashboardBody(
box(title = "Sankey Chart", status = "primary",height = "455" ,solidHeader = 
T,plotlyOutput("sankey_plot")),
box( title = "Case Summary", status = "primary", height = "455",solidHeader 
= T, dataTableOutput("sankey_table"))
))
server <- function(input, output) 
{ 
sankeyData <- reactive({
sankeyData <- a12 %>% 
  group_by(a1,a2) %>% 
  count()
sankeyNodes <- list(label = c(sankeyData$a1,sankeyData$a2) %>% unique())
trace2 <- list(
  domain = list(
    x = c(0, 1), 
    y = c(0, 1)
  ), 
  link = list(
    label = paste0("Case",1:nrow(sankeyData)), 
    source = sapply(sankeyData$a1,function(e) {which(e == 
                                                       sankeyNodes$label) }, 
   USE.NAMES = FALSE) - 1, 
    target = sapply(sankeyData$a2,function(e) {which(e == 
                                                       sankeyNodes$label) }, 
    USE.NAMES = FALSE) - 1, 
    value = sankeyData$n
  ), 
  node = list(label = sankeyNodes$label), 
  type = "sankey"
  )
  trace2
  })
  output$sankey_plot <- renderPlotly({
  trace2 <- sankeyData()
  p <- plot_ly()
  p <- add_trace(p, domain=trace2$domain, link=trace2$link, 
               node=trace2$node, type=trace2$type)
  p
  })
  output$sankey_table <- renderDataTable({
  d <- event_data("plotly_click")
  req(d)
  trace2 <- sankeyData()
  sIdx <-  trace2$link$source[d$pointNumber+1]
  Source <- trace2$node$label[sIdx + 1 ]
  tIdx <- trace2$link$target[d$pointNumber+1]
  Target <- trace2$node$label[tIdx+1]
  a12 %>% filter(a1 == Source & a2 == Target)
  })
  }
  shinyApp(ui, server)
库(闪亮)
图书馆(shinydashboard)
图书馆(绘本)
图书馆(DT)
图书馆(dplyr)
a1=c(“A”、“B”、“c”、“A”、“c”、“c”、“c”、“B”)
a2=c(“E”、“F”、“G”、“E”、“G”、“G”、“G”、“F”)
a3=c(50,45,64,32,45,65,75)
a12=数据帧(a1、a2、a3、stringsAsFactors=FALSE)
a12$a1=as.字符(a12$a1)
a12$a2=as.字符(a12$a2)

ui我想你需要的解决方案是

value = apply(t(sankeyData),2, function(e, Vals){
           e <- data.frame(t(e), stringsAsFactors = FALSE)
           sum(Vals[which(e$a1 == Vals$a1 & e$a2 == Vals$a2),3])
         }, Vals = a12)
有了这个,你会得到这样的结果:


希望有帮助

谢谢,这很好,但如果您能将总和值安排在目标值以下,那么之前的值就是所有项目的计数。谢谢。你的意思是希望总和显示在目标之下?是的,请显示在目标之下。R plotly skankey图表似乎没有这个规定。可以做的一件事是在源代码之前添加它。非常感谢您的帮助,如果您在这方面遇到任何问题,请提出建议。
value = sankeyData$n