【问题标题】:networkD3 package: forceNetwork() - setting the linkDistancenetworkD3 包:forceNetwork() - 设置链接距离
【发布时间】:2022-08-15 04:53:14
【问题描述】:

我试图对我的节点图使用 forceNetwork() 函数。但是,我似乎无法设置链接距离。例如,在附图中,我想将所有绿色节点设置为与中心等距。目前,它们似乎距离更远,具体取决于连接到它们的粉红色节点的数量。我遵循了here 的建议,但无法让它工作。

这是我的代码(对不起摇摇欲坠的代码块):

library(networkD3)
library(htmlwidgets)

NUM_PNODES <- 100
NUM_DNODES <- 8
LINKDIST1 <- 1
LINKDIST2 <- 5
N_SIZE1 <- 2

### Parent edges and nodes
nodes.ID <- (1:NUM_PNODES)-1
nodes <- paste0(\'p\',1:NUM_PNODES)

source1 <- rep(nodes[1],max(nodes.ID))
target1 <- nodes[-1]
source_idx1 <- nodes.ID[1]
target_idx1 <- nodes.ID[-1]
linkdist1 <- LINKDIST1
links.df <- data.frame(source1,target1,source_idx1,target_idx1,linkdist1)

type <- rep(\'parent\',NUM_PNODES)
group <- 0
nodesize <- N_SIZE1
node.df <- data.frame(nodes,group,type,nodesize)

source1 <- target1 <- source_idx1 <- target_idx1 <- linkdist1 <- tdat <- c()

for(i in 1:NUM_DNODES){
  if(i==1){
    NCOUNT <- max(links.df$target_idx1) + 1
  }

  ### clone edges and nodes
  source1 <- \'p1\'
  target1 <- paste0(\'d\',i)
  source_idx1 <- 0
  target_idx1 <- NCOUNT
  linkdist1 <- LINKDIST2
  tdat <- data.frame(source1,target1,source_idx1,target_idx1,linkdist1)
  ndat <- data.frame(target1,i,\'clone\',N_SIZE1)
  colnames(ndat) <- c(\'nodes\',\'group\',\'type\',\'nodesize\')
  links.df <- rbind(links.df,tdat)
  node.df <- rbind(node.df,ndat)

  ### Daughter edges and nodes
  source1 <- rep(paste0(\'d\',i),i)
  target1 <- paste0(\'d\',i,\'.\',1:i)
  source_idx1 <- rep(NCOUNT,i)
  target_idx1 <- (NCOUNT+1):(NCOUNT+i)
  NCOUNT <- NCOUNT+i+1
  linkdist1 <- LINKDIST1
  tdat <- data.frame(source1,target1,source_idx1,target_idx1,linkdist1)
  ndat <- data.frame(target1,i,\'daughter\',N_SIZE1)
  colnames(ndat) <- c(\'nodes\',\'group\',\'type\',\'nodesize\')
  links.df <- rbind(links.df,tdat)
  node.df <- rbind(node.df,ndat)

}



ColourScale <- \'d3.scaleOrdinal()
    .domain([\"parent\", \"clone\", \"daughter\"])
   .range([\"blue\", \"green\", \"red\"]);\'

fn <- forceNetwork(Links = links.df, Nodes = node.df, 
             Source = \'source_idx1\', Target = \'target_idx1\', 
             NodeID = \'nodes\', Group = \'type\',
             bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
             colourScale = JS(ColourScale),
             linkDistance=JS(\'function(d) {\', \'return d.linkdist1;\', \'}\'))

fn$x$links$linkdist1 <- links.df$linkdist1
fn

谢谢你的帮助!

    标签: javascript r htmlwidgets networkd3


    【解决方案1】:

    这让我有点想明白。这是一个力量图表。所以军队作用于节点与它们的位置有很大关系。我的印象是您没有使用此图表力量方面,具体来说。

    如果您使用的是 JS 版本,则只需添加参数linkStrength。但是,它似乎没有被写入 R 版本。我不知道如何将其添加到另一个电话 onRender 或我能想到的任何其他电话中。我也尝试减少energy

    我确实做到了,但你可能不想走这条路。如果你想要参数linkStrength,你可以下载我为回答这个问题而做的repo。它的外观、感觉和行为都与 Cran 版本一样,除了这一关键区别,它将在函数 forceNetwork 中多了一个参数。 (在包中,我真的只对 forceNetwork.js 和 forceNetwork.R 做了改动。)

    要下载回购:

    devtools::install_github("fraupflaume/networkD3")
    

    当您调用库时,您的操作方式与以前相同。

    library(networkD3)
    

    完全按照您在问题中提供的数据代码使用,这里有一些示例说明无法控制链接强度和使用该参数之间的区别。

    本质上,您的原始图表;没有建立对力量的控制。

    forceNetwork(Links = links.df, Nodes = node.df, 
                 Source = 'source_idx1', Target = 'target_idx1', 
                 NodeID = 'nodes', Group = 'type',
                 bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
                 colourScale = JS(ColourScale))
    




    在该图中,定义了强度。

    forceNetwork(Links = links.df, Nodes = node.df, 
                 Source = 'source_idx1', Target = 'target_idx1', 
                 NodeID = 'nodes', Group = 'type',
                 bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
                 colourScale = JS(ColourScale),
                 linkStrength = 1)
    




    在该图中,指定了强度和长度。

    最后一个示例反映了您尝试实现的链接距离的变化。但是,我没有使用 1 和 5。我知道描述说明这些值是相对的……但它们似乎是相当字面的。

    forceNetwork(Links = links.df, Nodes = node.df, 
                 Source = 'source_idx1', Target = 'target_idx1', 
                 NodeID = 'nodes', Group = 'type',
                 bounded = TRUE, opacityNoHover = TRUE, zoom = TRUE,
                 colourScale = JS(ColourScale),
                 linkStrength = 1,
                 linkDistance = JS("
                 function(d){
                   return ((d.source.group === 'parent' && d.target.group === 'clone') ? 75 : 50 );
                 }"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2019-09-20
      • 1970-01-01
      相关资源
      最近更新 更多