关系图选择D3.js 还是 echarts的graph

根据需求个人更倾向于Echarts,在细节上有多属性能复用,也相对熟悉一下。如果很熟悉canvas的更倾向于使用d3的自定义;要考虑后端给的数据类型是什么,后端使用了图形化存储,d3就是不二选择了。如果数据是简单的关系层级,其实完全可以使用echarts。从数据json上是可以看到,两者的区别并不大。

D3.js的Neo4j前端展示

关系图
data.json

{
  "results": [
    {
      "columns": [
        "user",
        "entity"
      ],
      "data": [
        {
          "graph": {
            "nodes": [
              {
                "id": "1",
                "labels": [
                  "User"
                ],
                "properties": {
                  "userId": "eisman"
                }
              },
              {
                "id": "2",
                "labels": [
                  "Phone"
                ],
                "properties": {
                  "value": "555-555-5555"
                }
              }
            ],
            "relationships": [
              {
                "id": "1",
                "type": "NUMBER",
                "startNode": "1",
                "endNode": "2",
                "properties": {
                  "from": 1473581532586
                }
              }]
          }
        }
      ]
    }
  ],
  "errors": []
}

index.html

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width">
  <title>neo4jd3.js</title>
  <link rel="stylesheet" href="./neo4jd3.min.css?v=0.0.1">
  <style>
    body,
    html,
    .neo4jd3 {
      height: 100%;
      overflow: hidden;
    }
  </style>
</head>

<body>
  <div id="neo4jd3"></div>
  <script src="./d3.min.js"></script>
  <script src="./neo4jd3.min.js?v=0.0.1"></script>
  <script type="text/javascript">
    function init() {
      var neo4jd3 = new Neo4jd3('#neo4jd3', {
        // highlight: [
        //     {
        //         class: 'Project',
        //         property: 'name',
        //         value: 'neo4jd3'
        //     }, {
        //         class: 'User',
        //         property: 'userId',
        //         value: 'eisman'
        //     }
        // ],
        // icons: {
        //   'zoomOut': 'search-minus'
        // },
        // images: {
        //   'zoomOut': 'img/twemoji/1f50e.svg'
        // },
        minCollision: 60,
        neo4jDataUrl: './data.json',
        nodeRadius: 25,
        onNodeDoubleClick: function (node) {
          switch (node.id) {
            case '25':
              // Google
              window.open(node.properties.url, '_blank');
              break;
            default:
              var maxNodes = 5,
                data = neo4jd3.randomD3Data(node, maxNodes);
              neo4jd3.updateWithD3Data(data);
              break;
          }
        },
        onRelationshipDoubleClick: function (relationship) {
          console.log('double click on relationship: ' + JSON.stringify(relationship));
        },
        zoomFit: true
      });
    }

    window.onload = init;
  </script>

  <script>
    (function (i, s, o, g, r, a, m) {
      i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
        (i[r].q = i[r].q || []).push(arguments)
      }, i[r].l = 1 * new Date(); a = s.createElement(o),
        m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
    })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');

    ga('create', 'UA-430863-29', 'auto');
    ga('send', 'pageview');
  </script>
</body>

</html>

官方GitHub地址
文件地址:
d3.min.js
neo4jd3.min.css
neo4jd3.min.js

Echarts graph的前端展示

graph
echarts关系图官方案例

<!DOCTYPE html>

<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
</head>

<body>
  <div id="main" style="width: 400px; height:500px;"></div>
  <script>
    let chartDom = document.getElementById('main');
    let myChart = echarts.init(chartDom);

    // $.getJSON('./data.json').then(res => {
    //   const oldNodes = res.results[0].data[0].graph.nodes;
    //   const oldRelationships = res.results[0].data[0].graph.relationships;
    // })

    const nodes = [
      { name: '舆情大数据' },
      { name: '用户' },
      { name: '话题' },
    ]

    const links = [
      {
        source: '舆情大数据',
        target: '用户',
        name: "分析"
      },
      {
        source: '舆情大数据',
        target: '话题',
        name: "分析"
      },
    ]

    RenderEcharts(nodes, links)

    function RenderEcharts(data, links) {
      let option = {
        tooltip: {},
        animationDurationUpdate: 1000,
        animationEasingUpdate: 'quinticInOut',
        grid: {
          top: 0,
          left: 0
        },
        tooltip: {},
        series: [
          {
            type: 'graph',
            layout: 'force', // circular
            symbolSize: 100,
            roam: true, // 是否开启鼠标缩放和平移漫游
            draggable: false, // 节点是否可拖拽
            focusNodeAdjacency: true, // 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。
            autoCurveness: 0.01,
            radius: ['100%', '100%'],
            zoom: 1,
            symbol: 'circle',
            label: {
              show: true,
              fontSize: 14,
              color: '#333',
            },
            // edgeSymbol: ['circle', 'arrow'],
            edgeSymbol: 'none',
            edgeSymbolSize: [0, 4],
            edgeLabel: {
              show: true,
              fontSize: 10,
              padding: [8, 0, 0, 0],
              verticalAlign: 'middle',
              opacity: 1,
              formatter: x => `{a|${x.data.name}}`,
              rich: {
                a: {
                  padding: [2, 10, 2, 10],
                  backgroundColor: 'rgba(255, 164, 0, 1)',
                  align: 'center',
                  color: '#fff',
                  verticalAlign: 'middle',
                  borderRadius: 10,
                }
              }
            },
            data,
            links,
            lineStyle: {
              width: 1,
              color: 'rgba(0,0,0,1)',
              // curveness: 0.02 // 弯曲程度
            },
            itemStyle: {
              color: '#2ad5aa'
            },
            force: {
              repulsion: 600, // 值越大则斥力越大
              // gravity: 0.01, // 该值越大节点越往中心点靠拢
              edgeLength: 300, // 边的两个节点之间的距离
              layoutAnimation: true // 在浏览器端节点数据较多(>100)的时候不建议关闭,布局过程会造成浏览器假死。
            }
          }
        ]
      }
      option && myChart.setOption(option);

      myChart.on('click', (param) => {
        if (param.dataType == 'node') {
          console.log('点击了节点')
        } else {
          console.log('点击了边', param.data)
        }
      })
    }
  </script>
</body>

</html>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
D3.js(Data-Driven Documents)是一个用于创建交互式数据可视化的JavaScript库。虽然它主要用于创建二维数据可视化,但你也可以使用它来构建三维知识导。 要创建一个基于D3.js的三维知识导,你可以使用一些其他的库或工具来实现。以下是一个使用D3.js和Three.js(用于WebGL渲染)的简单示例: 1. 首先,确保你已经引入了D3.js和Three.js的库文件。 ```html <script src="https://d3js.org/d3.v6.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> ``` 2. 创建一个空的HTML元素来容纳你的三维知识导。 ```html <div id="knowledge-graph"></div> ``` 3. 在JavaScript中,选择这个容器元素并设置一些基本的参数。 ```javascript const container = d3.select("#knowledge-graph"); const width = container.node().getBoundingClientRect().width;const height = container.node().getBoundingClientRect().height; ``` 4. 使用Three.js创建一个场景、相机和渲染器。 ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(width, height); container.node().appendChild(renderer.domElement); ``` 5. 创建一些对象来表示你的知识节点,并将它们添加到场景中。 ```javascript const geometry = new THREE.SphereGeometry(1, 32, 32); const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const sphere = new THREE.Mesh(geometry, material); scene.add(sphere); ``` 6. 添加一些交互功能,例如旋转、缩放等。 ```javascript function animate() { requestAnimationFrame(animate); // 添加你的交互逻辑代码,例如让节点旋转或响应鼠标事件 renderer.render(scene, camera); } animate(); ``` 这只是一个基本示例,你可以根据需要进行更多的定制和扩展。希望这对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值