D3 节点半径取决于链接数量:权重属性

2023-12-12

我正在尝试使用 D3 创建力定向图。 就目前而言,节点的半径取决于核心价值JSON 中的对(d.尺寸)

我知道d3.权重属性可用于计算链接数量并关联圆的半径属性,但我不知何故无法让它工作。

请在这件事上给予我帮助。

找到下面的代码:

d3.json('graph.json', (error, graph) => {
  const width = 1200;
  const height = 900;

  const simulation = d3.forceSimulation()
    .nodes(graph.nodes)
    .force('link', d3.forceLink().id(d => d.id))
    .force('charge', d3.forceManyBody().strength([-605]))
    .force('center', d3.forceCenter(width / 2, height / 2))
    .on('tick', ticked);

  simulation.force('link')
    .links(graph.links)
    .distance([140]);

  const R = 30;

  const svg = d3.select('body').append('svg')
    .attr('width', width)
    .attr('height', height);

  // add defs-marker
  // add defs-markers
  svg.append('svg:defs').selectAll('marker')
    .data([{ id: 'end-arrow', opacity: 1 }, { id: 'end-arrow-fade', opacity: 0.1 }])
    .enter().append('marker')
      .attr('id', d => d.id)
      .attr('viewBox', '0 0 10 10')
      .attr('refX', 2 * R)
      .attr('refY', 5)
      .attr('markerWidth', 4)
      .attr('markerHeight', 4)
      .attr('orient', 'auto')
      .append('svg:path')
        .attr('d', 'M0,0 L0,10 L10,5 z')
        .style('opacity', d => d.opacity);

  let link = svg.selectAll('line')
    .data(graph.links)
    .enter().append('line');

  link  
    .attr('class', 'link')
    .attr('marker-end', 'url(#end-arrow)')
    .on('mouseout', fade(1));

  let node = svg.selectAll('.node')
    .data(graph.nodes)
    .enter().append('g')
    .attr('class', 'node');

  node.append('circle')
    .attr('r', function (d) {
                return (d.size * 12);
            })
    .on('mouseover', fade(0.1))
    .on('mouseout', fade(1))
    .call(d3.drag()
      .on("start", dragstarted)
      .on("drag", dragged)
      .on("end", dragended));

  node.append('text')
    .attr('x', 0)
    .attr('dy', '.35em')
    .text(d => d.name);

  function ticked() {
    link
      .attr('x1', d => d.source.x)
      .attr('y1', d => d.source.y)
      .attr('x2', d => d.target.x)
      .attr('y2', d => d.target.y);

    node
      .attr('transform', d => `translate(${d.x},${d.y})`);
  }


  function dragstarted(d) {
    if (!d3.event.active) simulation.alphaTarget(0.3).restart();
    d.fx = d.x;
    d.fy = d.y;
  }

  function dragged(d) {
    d.fx = d3.event.x;
    d.fy = d3.event.y;
  }

  function dragended(d) {
    if (!d3.event.active) simulation.alphaTarget(0);
    d.fx = null;
    d.fy = null;
  }

  const linkedByIndex = {};
  graph.links.forEach(d => {
    linkedByIndex[`${d.source.index},${d.target.index}`] = 1;
  });

  function isConnected(a, b) {
    return linkedByIndex[`${a.index},${b.index}`] || linkedByIndex[`${b.index},${a.index}`] || a.index === b.index;
  }

  function fade(opacity) {
    return d => {
      node.style('stroke-opacity', function (o) {
        const thisOpacity = isConnected(d, o) ? 1 : opacity;
        this.setAttribute('fill-opacity', thisOpacity);
        return thisOpacity;
      });

      link.style('stroke-opacity', o => (o.source === d || o.target === d ? 1 : opacity));
      link.attr('marker-end', o => (opacity === 1 || o.source === d || o.target === d ? 'url(#end-arrow)' : 'url(#end-arrow-fade)'));
    };
  }
})

JSON结构如下:

{
    "nodes": [
        {
            "name": "A",
            "id": 0,
            "size": 1
        },
        {
            "name": "D",
            "id": 1,
            "size": 2
        },
        {
            "name": "K",
            "id": 2,
            "size": 3
        }
    ],
    "links": [
        {
            "source": 0,     //id of the soure application
            "target": 1      //id of the destination application
        },
        {
            "source": 0,
            "target": 2
        },
        {
            "source": 3,
            "target": 4
        }
    ]
}

d3.v4不支持weight属性。所以我认为你必须自己计算节点权重。试试这个方法。

node.append("circle")
   .attr("r", function(d) {      
     d.weight = link.filter(function(l) {
       return l.source.index == d.index || l.target.index == d.index
     }).size();      
     var minRadius = 10;
     return minRadius + (d.weight * 2);
   });

在 d3.v3 中,我们有权重属性,可以如下所示使用。

node.append("circle")
  .attr("r", function(d) {
    var minRadius = 10;
    return minRadius + (d.weight * 2);
  });

小提琴示例 -https://jsfiddle.net/gilsha/9d6edrte/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3 节点半径取决于链接数量:权重属性 的相关文章

  • 在移动浏览器或 PhoneGap 应用程序之间进行检测

    是否可以使用 JavaScript 检测用户是否通过浏览器或应用程序进行访问 我正在通过网页和 PhoneGap 应用程序开发适用于多个移动操作系统的混合应用程序 目标是 独立于部署目标使用相同的代码 仅当用户代理是应用程序时添加 Phon
  • 使用 fadeIn() 时,jQuery“未捕获类型错误:未定义不是函数”;

    我是 JS 新手 正在编写一个基本的富含 jQuery 的网页 其中同一文档中的每个页面都具有淡入 淡出功能 使用具有单独 ID 的相同 div 元素 无论如何 当我尝试淡入当前页面时 我收到错误 未捕获的类型错误 未定义不是函数 我在网上
  • 通过单击堆叠条形图打开选项卡

    我正在使用 R 构建一个包含转发的堆积条形图 ggplot and plotly 如果单击条形图的一部分 我希望打开一个新的浏览器选项卡并显示该特定日期的推文以及指定的转发量 但是 当我单击下面示例中的其中一个栏时 会打开一个不同的链接 表
  • 查找数组中多个最大值的索引

    我有一个示例数组 var arr 10 67 100 100 我想找到数组中最大值的索引 该函数仅查找一个索引 function max arr var max arr 0 var maxIndex 0 for var i 1 i lt a
  • 仅当 url 以 www 为前缀时才会发生 CORS 错误

    我目前遇到一个关于 CORS 跨源资源共享 的问题 奇怪的是 只有当我使用 www url 前缀时 才会出现这种情况 例如 当我使用以下网址访问我的网站时 http example com index http example com in
  • 单击元素外部时触发事件的指令

    我知道有很多问题都在问类似的事情 但没有人真正解决我的问题 我正在尝试构建一个指令 当鼠标单击当前元素外部时 该指令将执行表达式 为什么我需要这个功能 我正在构建一个应用程序 在这个应用程序中 有 3 个下拉菜单 5 个下拉列表 如选择的
  • HTML5 Audio Element 无法在 IOS 11 设备上的 safari 中播放 mp3 直播

    我是一家广播公司的网络开发人员 自 iOS 11 发布以来 我们收到了一些用户投诉 称我们的音频直播流无法再在 IOS 11 设备上播放 为了将流嵌入我们的网站 我们使用 HTML5 AudioElement 在 iOS 11 的 iPho
  • 获取 Firebase AngularFire 中项目的索引 ID

    这里提出了类似的问题 但接受的答案并没有真正回答这个问题 使用 AngularFire 是否可以创建关系型数据库 或者访问 UniqueID https stackoverflow com questions 16879484 using
  • 在 forEach() 中使用 `this` [重复]

    这个问题在这里已经有答案了 免责声明 我正在学习 JavaScript 我有一个像这样的对象构造函数 var Palette function this colors red green blue this getColorCombinat
  • 如何按日期升序对对象进行排序?

    如果我有一个对象列表 var objectList LIST OF OBJECT each object列表中包含三个属性 name date gender 如何按 对列表中的对象进行排序date 属性升序 the date 属性包含字符串
  • Spark运行错误java.lang.NoClassDefFoundError: org/codehaus/jackson/annotate/JsonClass

    import org apache spark SparkContext import org apache spark SparkConf import play api libs json import java util Date i
  • 为什么 Number.isNaN() 对字符串返回 false?

    据我的理解NaN代表Not A Number Strings不是绝对的Numbers因此我希望下面的代码返回true对于字符串 然而 事实并非如此 console log Number isNaN Stack Overflow 有人可以澄清
  • PHP:在执行 php 脚本时显示“正在加载”页面

    这就是我现在所拥有的 我有一个网页 当访问该网页时 它会通过开放 API 连接到 Surveygizmo com 检索大量数据 然后将这些数据返回给我进行处理 此过程大约需要 10 12 秒 在执行时 页面只是处于 正在加载 状态 并且我会
  • queue.js 是如何工作的?

    我一直试图理解如何Mike Bostock 的queue js https github com mbostock queue blob master queue js有效 但我看不出它是如何工作的 我不明白的部分是代码如何设法继续执行回调
  • 掩码输入数字 - 百分比

    如何通过 jQuery 创建具有百分比的数字掩码输入 我是否让输入仅接受三个数字 并在用户完成输入时在数字后添加百分号 keyup 我不使用插件 例子 1 Or 30 Or 99 Or 100 Or 200
  • 在 Nest.js 中发送之前如何格式化响应?

    我按照文档进行操作 并能够添加用于响应映射的拦截器 我想要一致的 json 格式输出作为响应 我怎样才能用拦截器或其他比这种方法更好的方法来实现这一点 statusCode 201 message Custom Dynamic Messag
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • JavaScript:如何在 Internet Explorer 中模拟更改事件(委托)

    UPDATE 回顾 小提琴和赏金 这个问题并没有引起太多关注 所以我将花一些时间来解决这个问题 我知道我的答案和问题都过于冗长 这就是为什么我继续设置这把小提琴 http jsfiddle net vVA8N 在我看来 这是我目前必须用来接
  • 获取css规则、chrome扩展

    我正在开发 Chrome 扩展程序 它需要访问document styleSheets cssRules 它在某些网站上运行良好 例如w3school 但其他人则不然 比如堆栈溢出 我收到错误 Failed to read the cssR
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl

随机推荐

  • 角度数据表列可拖出表格

    是否可以避免该列 而不是拖出数据表视图区域 正如您可以自己看出的那样 我从此链接中谈论的内容https l lin github io angular datatables withColReorder when you try to dr
  • 是否存在禁用 file_get_contents() 函数工作的机制?

    i use file get contents 函数从站点获取数据并将数据存储在数据库中 如果有一天脚本开始不起作用 这对我来说将非常不方便 我知道 如果他们改变网站的结构 它可能会开始不起作用 但现在我担心 也许有机制可以禁用此功能的工作
  • Android 模拟器无法访问互联网

    我无法在模拟器中访问互联网 它甚至无法在模拟器浏览器上连接到谷歌 我已经检查过设置 数据已启用复选框已选中 在发布问题之前我提到了一些SO问题 As 这个答案建议 我没有启用 wifi 所以这似乎不是问题 作为另一个答案在同一个问题中 我尝
  • IBM Worklight - 连接/重新连接:WL.Client.connect 与 connectOnStartup 与 WL.Client.invokeProcedure

    在我们的项目中 我们试图弄清楚连接到服务器的最佳流程是什么 特别是在处理离线 在线场景等时 现在 对于我们来说 连接到 WL 服务器的所有三个选项似乎都是相似的 无论我们使用什么选项 我们都可以完美地调用我们的适配器过程 并且我们会收到在控
  • 使用 SendInput 发送两个或多个字符

    要发送字符 我们可以使用 SendInput 我如何使用它来发送多个字符 我尝试了这段代码 但它没有发送任何内容 INPUT in in type INPUT KEYBOARD in ki wScan 0 in ki time 0 in k
  • 如何结合代码优先和数据库优先方法

    假设我是一家公司的新开发人员 所以该项目已经有一个现有的数据库 为了处理这个项目 显然我需要搭建现有的数据库 数据库优先方法 它可以生成模型类供我处理 因此 我开始处理该项目 并希望向表中添加一个新列 因此我在模型类上添加一个新属性 然后我
  • 经典 ASP VBScript 中的 HMAC 算法 (SHA256)

    我正在尝试使用 SHA256 作为哈希在经典 ASP 中编写 HMAC 函数 我认为我做对了 但结果与列出的示例不同维基百科页面 我见过几个人们通过包含 WSC 在经典 ASP 中使用 HMAC SHA256 的示例 这不是我想做的 这是函
  • Python套接字同时接收多条消息

    我正在使用 python 3 套接字进行 TCP IP 聊天 并且在多个 socket send socket receive 对实例上遇到了同样的问题 举个例子 每次服务器更新已连接客户端的列表时 它首先发送一个字符串信号表明它将要执行此
  • NSString 保留计数 -1

    我想打印保留计数NSString in AppDelegate班级在didFinishLaunchingWithOptions method NSString str NSString alloc init NSLog str retain
  • C 中的运算符结合性特别是前缀和后缀递增和递减

    在 C 运算中 结合性是指递增 递减和赋值 2 postfix and 3 prefix and 16 Direct assignment 完整列表可以在这里找到C 中的维基百科运算符 我的问题是当我们有 int a b b 1 a b p
  • 无法构建 ASP.NET Core 2.0 + Angular 2/4 - 用户注册和登录应用程序

    我正在尝试在 IIS 服务器上部署 ASP NET Core 2 0 Angular 2 4 用户注册和登录应用程序 取自链接 https www pointblankdevelopment com au blog 134 aspnet c
  • 在 Java 中,对 Class.class 的引用有什么作用?

    我正在构建一个小型 Android 应用程序 但这更像是一个 Java 问题 而不是 Android 问题 浏览教程 有一些行看起来像 startService new Intent this MyService class MyServi
  • 如何获取接近另一种颜色的RGB值?

    如果我有 RGB 颜色 如何创建一个 javascript 函数 当另一个 RGB 值接近初始 RGB 时返回 true 否则返回 false 我已经使用过这个并且它对我来说非常有效 assuming that color1 and col
  • 如何在Python 3中通过FTP从内存上传数据?

    我想通过 FTP 将内存中的各种数据 数组内容 静态 html 代码等 上传到网络服务器 这仅适用于一个基本字符串 Hello World from ftplib import FTP import io bio io BytesIO b
  • 移动应用程序时会重置用户设置

    我注意到 如果您将该应用程序 exe 文件移动到另一个位置 用户设置将重置 据我了解 发生这种情况是因为应用程序数据文件夹中的位置也基于 exe 的路径 在生成哈希时会考虑到这一点 我知道有不同的替代方案 可以使用注册表或手动创建自定义配置
  • 将 null 放置在列表末尾

    我需要将空对象放置在末尾List 这是我为此目的所做的示例 public static void main String args List
  • 如何显示ProgressBar并使其进度?(Xamarin.Android)

    我调用一个 Web 服务 它获取 4 个文件 在加载这些文件时 我想向用户显示进度 圆形或水平都没关系 我已按照互联网上的示例进行操作 但屏幕上没有显示任何内容 MobileSellReference Service1 service ne
  • 有没有办法分析 Chromecast 崩溃?

    显然 崩溃后 端口 9222 上的开发者工具没有任何用处 因为 远程调试已因原因终止 websocket close 例如 我如何检索记录的时间线 或获取调用堆栈 或者找到有关 Chromecast 决定自行重启的原因的任何信息 调试 Ch
  • 在 JS 中移动元素

    我正在学习 javascript 并尝试做一个简单的练习 我有一个文本框并想用键盘控制它 我的 HTML 如下 目前 我只是尝试 1 个方向 const myBox document querySelector h1 document ad
  • D3 节点半径取决于链接数量:权重属性

    我正在尝试使用 D3 创建力定向图 就目前而言 节点的半径取决于核心价值JSON 中的对 d 尺寸 我知道d3 权重属性可用于计算链接数量并关联圆的半径属性 但我不知何故无法让它工作 请在这件事上给予我帮助 找到下面的代码 d3 json