以下是一个使用d3.js
创建简单人脉关系图的示例:
一、基础概念
id
、name
等属性,边对象可能包含source
(源节点的id
)、target
(目标节点的id
)等属性。d3.js
提供了多种布局算法用于确定节点的位置。对于人脉关系图,力导向布局(force - directed layout)比较常用。这种布局算法模拟物理系统中的力,节点之间相互吸引或排斥,从而形成一种相对美观且能体现关系的布局。二、优势
三、类型
四、应用场景
五、示例代码
以下是一个简单的d3.js
人脉关系图示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF - 8">
<meta name="viewport" content="width=device-width, initial - scale = 1.0">
<title>D3.js人脉关系图示例</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
.node {
stroke: #fff;
stroke - width: 1.5px;
}
.link {
fill: none;
stroke: #ccc;
stroke - width: 1.5px;
}
</style>
</head>
<body>
<script>
// 数据定义
const nodes = [
{ id: "Alice", group: 1 },
{ id: "Bob", group: 1 },
{ id: "Charlie", group: 2 },
{ id: "David", group: 2 }
];
const links = [
{ source: "Alice", target: "Bob" },
{ source: "Bob", target: "Charlie" },
{ source: "Charlie", target: "David" },
{ source: "David", target: "Alice" }
];
const width = 500;
const height = 500;
const svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
// 力导向布局
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id))
.force("charge", d3.forceManyBody())
.force("center", d3.forceCenter(width / 2, height / 2));
// 绘制边
const link = svg.append("g")
.attr("class", "links")
.selectAll("line")
.data(links)
.enter().append("line")
.attr("class", "link");
// 绘制节点
const node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 10);
// 添加标签
const labels = svg.append("g")
.attr("class", "labels")
.selectAll("text")
.data(nodes)
.enter().append("text")
.text(d => d.id);
// 更新节点和边的位置
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);
labels
.attr("x", d => d.x)
.attr("y", d => d.y);
});
</script>
</body>
</html>
在这个示例中:
SVG
画布来绘制图形。tick
事件)时调整它们的位置。如果要进一步扩展这个示例,可以考虑以下几点:
d3.select
选择节点元素,然后添加on("click", function(d) {...})
事件处理程序。group
属性)设置不同的颜色,以区分不同的人群类别。XMLHttpRequest
或者fetch
API来动态加载数据,然后更新图表。如果在实际应用中遇到问题,例如布局混乱或者节点重叠:
forceManyBody
的强度(例如d3.forceManyBody(-30)
中的数值),或者调整forceLink
的相关参数。