d3.js 是一个用于数据可视化的 JavaScript 库,它允许开发者使用 HTML、SVG 和 CSS 将数据绑定到文档,并通过数据驱动的方式操作文档。Bubble Chart(气泡图)是一种常用的数据可视化形式,其中每个气泡代表一个数据点,气泡的大小、位置和颜色可以表示不同的数据属性。
以下是一个简单的 d3.js Bubble Chart 实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>D3.js Bubble Chart</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
.bubble {
fill: steelblue;
stroke: #fff;
stroke-width: 1.5px;
}
</style>
</head>
<body>
<svg width="960" height="500"></svg>
<script>
const svg = d3.select("svg");
const width = +svg.attr("width");
const height = +svg.attr("height");
const data = [
{name: "A", value: 30},
{name: "B", value: 80},
{name: "C", value: 45},
// 更多数据...
];
const maxRadius = d3.max(data, d => d.value);
svg.selectAll(".bubble")
.data(data)
.enter().append("circle")
.attr("class", "bubble")
.attr("cx", (d, i) => i * 100 + 50)
.attr("cy", height / 2)
.attr("r", d => Math.sqrt(d.value / maxRadius) * 50)
.append("title")
.text(d => `${d.name}: ${d.value}`);
</script>
</body>
</html>
问题:气泡大小不一致或过大/过小。
原因:可能是数据值的范围差异太大,导致气泡大小不协调。
解决方法:使用比例尺(如 d3.scaleSqrt()
)来调整气泡的大小,确保视觉上的平衡。
const radiusScale = d3.scaleSqrt()
.domain([0, maxRadius])
.range([0, 50]);
然后在设置气泡半径时使用这个比例尺:
.attr("r", d => radiusScale(d.value))
通过这种方式,可以确保所有气泡的大小都在一个合理的范围内,从而使图表更加美观和易于解读。