当前位置:首页 > JavaScript

js实现网络图

2026-01-31 01:55:14JavaScript

使用 D3.js 绘制网络图

D3.js 是一个强大的 JavaScript 库,适合创建复杂的网络图。以下是一个简单的实现示例:

// 定义 SVG 尺寸
const width = 800;
const height = 600;

// 创建 SVG 元素
const svg = d3.select("body").append("svg")
  .attr("width", width)
  .attr("height", height);

// 模拟数据
const data = {
  nodes: [
    { id: 1, name: "Node 1" },
    { id: 2, name: "Node 2" },
    { id: 3, name: "Node 3" }
  ],
  links: [
    { source: 1, target: 2 },
    { source: 2, target: 3 }
  ]
};

// 创建力导向布局
const simulation = d3.forceSimulation(data.nodes)
  .force("link", d3.forceLink(data.links).id(d => d.id))
  .force("charge", d3.forceManyBody().strength(-100))
  .force("center", d3.forceCenter(width / 2, height / 2));

// 绘制连线
const link = svg.append("g")
  .selectAll("line")
  .data(data.links)
  .enter().append("line")
  .attr("stroke", "#999");

// 绘制节点
const node = svg.append("g")
  .selectAll("circle")
  .data(data.nodes)
  .enter().append("circle")
  .attr("r", 10)
  .attr("fill", "#69b3a2");

// 更新位置
simulation.on("tick", () => {
  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("cx", d => d.x)
    .attr("cy", d => d.y);
});

使用 vis.js 创建交互式网络图

vis.js 提供了更简单的 API 来创建网络图:

js实现网络图

// 准备数据
const nodes = new vis.DataSet([
  { id: 1, label: "Node 1" },
  { id: 2, label: "Node 2" },
  { id: 3, label: "Node 3" }
]);

const edges = new vis.DataSet([
  { from: 1, to: 2 },
  { from: 2, to: 3 }
]);

// 配置选项
const options = {
  nodes: {
    shape: "dot",
    size: 16
  },
  physics: {
    enabled: true
  }
};

// 创建网络图
const container = document.getElementById("network");
const data = { nodes, edges };
const network = new vis.Network(container, data, options);

使用 Cytoscape.js 实现专业网络图

Cytoscape.js 是专门为网络图设计的库:

js实现网络图

// 初始化 Cytoscape
const cy = cytoscape({
  container: document.getElementById("cy"),
  elements: [
    { data: { id: "n1" } },
    { data: { id: "n2" } },
    { data: { id: "n3" } },
    { data: { source: "n1", target: "n2" } },
    { data: { source: "n2", target: "n3" } }
  ],
  style: [
    {
      selector: "node",
      style: {
        "background-color": "#666",
        "label": "data(id)"
      }
    },
    {
      selector: "edge",
      style: {
        "width": 3,
        "line-color": "#ccc"
      }
    }
  ],
  layout: {
    name: "cose",
    animate: true
  }
});

使用 Sigma.js 处理大规模网络

Sigma.js 适合渲染大规模网络图:

// 初始化 Sigma
const s = new sigma({
  renderer: {
    container: document.getElementById("sigma-container"),
    type: "canvas"
  },
  settings: {
    defaultNodeColor: "#ec5148"
  }
});

// 添加数据
s.graph.addNode({
  id: "n1",
  label: "Node 1",
  x: 0,
  y: 0,
  size: 1
});

s.graph.addNode({
  id: "n2",
  label: "Node 2",
  x: 1,
  y: 1,
  size: 1
});

s.graph.addEdge({
  id: "e1",
  source: "n1",
  target: "n2"
});

// 刷新渲染
s.refresh();

自定义 Canvas 实现简单网络图

对于简单需求,可以直接使用 Canvas API:

const canvas = document.getElementById("network-canvas");
const ctx = canvas.getContext("2d");

// 节点数据
const nodes = [
  { x: 100, y: 100, r: 10, label: "A" },
  { x: 200, y: 150, r: 10, label: "B" },
  { x: 150, y: 250, r: 10, label: "C" }
];

// 连线数据
const links = [
  { from: 0, to: 1 },
  { from: 1, to: 2 }
];

// 绘制连线
ctx.strokeStyle = "#999";
links.forEach(link => {
  const from = nodes[link.from];
  const to = nodes[link.to];
  ctx.beginPath();
  ctx.moveTo(from.x, from.y);
  ctx.lineTo(to.x, to.y);
  ctx.stroke();
});

// 绘制节点
ctx.fillStyle = "#69b3a2";
nodes.forEach(node => {
  ctx.beginPath();
  ctx.arc(node.x, node.y, node.r, 0, Math.PI * 2);
  ctx.fill();

  // 绘制标签
  ctx.fillStyle = "#000";
  ctx.fillText(node.label, node.x + 15, node.y + 5);
});

以上方法涵盖了从简单到复杂的各种网络图实现方案,可根据项目需求选择合适的库和技术方案。

标签: 网络图js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在H…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…