js.创建节点_使用D3.js创建图的复合节点

js.创建节点

最近,我一直在使用D3可视化React项目的数据,这引起了我一段时间的注意。 我对这个非常强大的工具的范围特别感兴趣,该工具具有与任何类型的数据可视化有关的强大的问题解决能力范围。

它给您一种您可以做__ANYTHING__的感觉。 好吧,让我们谈谈。

什么是D3.js?

D3.js是用于可视化数据JavaScript库。 结合使用__SVG__ (支持矢量图形)和__HTML__它非常强大。

现在,它取决于使用它的开发人员的创造力,从而以最漂亮的方式对其进行可视化。

由于这是数据驱动的,因此d3.js可以处理纯数据并以图形方式对其进行转换。 应用d3.js时,您将做很多CSS,同时解决一些数学坐标几何问题。 例如,应用勾股定理,计算图上两个坐标` (x1, y1) `和` (x2, y2) `之间的距离。

本文着重于创建图的复杂节点,该节点是连接了许多元素或信息的节点,而不仅仅是一个空的圆圈。

您会发现很多示例片段和要点 ,尤其是在bl.ocks.orgstackoverflowobservablehq上,它们用于创建具有v3版本的图形或树,而在最新的v5版本上却很少。

前提条件

HTML,CSS,Javascript,坐标几何。

开始吧

我们将编写一个简单的工作脚本来创建复杂的SVG节点。

您需要在html <body>包含以下<script> <body>才能使用d3 v5库。

< body >
      < script src = "https://d3js.org/d3.v5.min.js" >  </ script >

</ body >

画布和数据容器元素

为所有SVG元素将驻留的画布指定一些widthheight 。 然后,我们在body元素上调用d3.select()d3.select()添加svg ,并指定诸如widthheight类的属性。目前,我们将json数据作为带有某些参数的nodes ,可能需要对其进行可视化。

< script > 
      var width = 500 , height = 400 ;
      const nodes = [
        {
          id: 0 ,
          name: "ServiceGroup" ,
          description: "Port : 80" ,
          connection_count: 3
        }
      ];

      const svg = d3
        .select( "body" )
        .append( "svg" )
        .attr( "width" , width)
        .attr( "height" , height);
 </ script >

让我们将新元素g附加到svg变量(画布)中,然后将节点数据插入到其中,并使用id索引。

let circle = svg
            .append( "svg:g" )
            .selectAll( "g" )
            .data(nodes, d => d.id);
const g = circle.enter();

矩形节点

现在我们将rect元素附加到我们的svg ,其(x,y)坐标为(0,0)

const rectangularNode = g
        .append( "svg:rect" )
        .attr( "class" , "node" )
        .attr( "x" , d => {
          return 0 ;
        })
        .attr( "y" , d => {
          return 0 ;
        });

现在,在这里很难确定要放置在矩形节点内的元素的位置。 我们已经准备好基本节点,并且将参照矩形节点而不是画布放置内部元素。 其中一种方法是使用getBBox()获取坐标rect元素。

var outerNodebbox = rectangularNode.node().getBBox();

图像元素

由于我们具有此框的放置坐标,因此可以将事物放置在其中。

假设我要放在徽标下方。

这很简单

const images = g
        .append( "svg:image" )
        .attr(
          "xlink:href" ,
          "https://img.icons8.com/ios-glyphs/30/000000/superman.png"
        )
        .attr( "x" , function ( d )  {
          let X = outerNodebbox.x;
          return X + 10 ;
        })
        .attr( "y" , function ( d )  {
          let Y = outerNodebbox.y;
          let HEIGHT = outerNodebbox.height;
          return Y + HEIGHT / 3 ;
        });

如您所见,我们对内部位置的变量XY了一些调整。 我希望图像位于中间,从左侧按标签( 10 )。

文字元素

类似地,添加文本,我们使用键使用节点数据,并将text附加到svg如下所示:

const label = g
        .append( "svg:text" )
        .attr( "class" , "name" )
        .attr( "dx" , function ( d )  {
          return outerNodebbox.width / 3 ;
        })
        .attr( "dy" , function ( d )  {
          return outerNodebbox.height / 3 ;
        })
        .attr( "dominant-baseline" , "central" )
        .text( d => {
          return d[ "name" ];
        });

另一个添加文字的例子

const description = g
        .append( "svg:text" )
        .attr( "class" , "description" )
        .attr( "dx" , function ( d )  {
          return outerNodebbox.width / 3 ;
        })
        .attr( "dy" , function ( d )  {
          return ( 2 * outerNodebbox.height) / 3 ;
        })
        .attr( "dominant-baseline" , "central" )
        .text( d => {
          return d[ "description" ];
        });

圆形柜台元素

现在,如果我想在矩形节点内插入一个圆并在其中保持文本,该怎么办。 我们这样做如下:

const count_circle = g
        .append( "svg:circle" )
        .attr( "class" , "countCircle" )
        .style( "visibility" , "unset" )
        .attr( "r" , 10 )
        .attr( "cx" , function ( d )  {
          let X = outerNodebbox.x;
          let WIDTH = outerNodebbox.width;
          return X + ( 2.5 * WIDTH) / 3 ;
        })
        .attr( "cy" , function ( d )  {
          let Y = outerNodebbox.y;
          let HEIGHT = outerNodebbox.height;
          return Y + ( 2 * HEIGHT) / 3 ;
        });

和文字

const count_text = g
        .append( "svg:text" )
        .attr( "class" , "countText" )
        .attr( "r" , 10 )
        .attr( "dx" , function ( d )  {
          let X = outerNodebbox.x;
          let WIDTH = outerNodebbox.width;
          return X + ( 2.5 * WIDTH) / 3 ;
        })
        .attr( "dy" , function ( d )  {
          let Y = outerNodebbox.y;
          let HEIGHT = outerNodebbox.height;
          return Y + ( 2 * HEIGHT) / 3 ;
        })
        .attr( "dominant-baseline" , "central" )
        .text( d => {
          return d[ "connection_count" ];
        });

最后,只需将所有元素合并为一个即可。

circle = g.merge(circle);

如果您想了解浏览器检查时的外观,请亲自看看。

酷吧! 您可以在此处找到完整的代码

学习愉快!

先前发布在 https://medium.com/@afrinchakure12/a-composite-node-of-a-graph-using-d3-js-v5-146a0e0a0473

翻译自: https://hackernoon.com/creating-composite-node-of-a-graph-using-d3js-sfa33y0x

js.创建节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值