【d3.js入门】基本饼图

367 阅读4分钟

D3.js是一个用于数据可视化的JavaScript库,它可以通过使用HTML,SVG和CSS来创建各种各样的图表。在本教程中,我们将使用D3.js创建一个基本饼图,并介绍一些D3.js概念和技术。

步骤1 - 准备数据

在开始之前,我们需要准备一些数据,这些数据将被用于创建饼图。在这个例子中,我们将使用一个包含四个季节及其对应值的数组作为示例数据。

var dataset = [
    { name: "春", value: 20 },
    { name: "夏", value: 50 },
    { name: "秋", value: 20 },
    { name: "冬", value: 80 }
];

步骤2 - 创建容器

接下来,我们需要创建一个SVG容器来放置我们的饼图。首先,我们定义了两个变量来指定SVG的宽度和高度:

var svgWidth = 600;
var svgHeight = 400;

接着,我们可以使用D3.js选择器方法d3.select()append()创建SVG元素,并指定其属性,比如宽度和高度:

var svg = d3.select("body")
    .append("svg")
    .attr("width", svgWidth)
    .attr("height", svgHeight);

现在,我们已经创建了一个空的SVG容器,接下来的步骤将在这个容器中添加元素以显示饼图。

步骤3 - 定义布局和生成器

在创建饼图之前,我们需要定义几个重要的概念:布局和生成器。

布局(layout)用于将数据转换为可用于绘制的形式,而生成器(generator)则用于创建具体的可视化元素。对于饼图,D3.js提供了两种相关的布局:d3.pie()d3.arc()

首先,我们需要定义一个饼布局(pie layout),它将使用值(value)属性来确定各个扇形的大小。该布局可以使用.value()方法来指定dataset中的值属性:

var pieLayout = d3.pie()
    .value(function (d) {
        return d.value;
    });

接着,我们需要定义一个弧生成器(arc generator),它可以将一个数据对象转换为一个SVG路径(path)字符串。该生成器可以使用.innerRadius().outerRadius()方法来设置内半径和外半径。对于饼图,我们将内半径设为0.5倍的饼图半径,将外半径设为实际饼图半径:

var radius = Math.min(svgWidth, svgHeight) / 3;

var arcGenerator = d3.arc()
    .innerRadius(radius * 0.5)
    .outerRadius(radius);

现在我们已经定义了布局和生成器,接下来的步骤将使用这些概念来创建饼图。

步骤4 - 创建饼图

我们已经定义了一个饼布局和一个弧生成器,现在可以使用它们来创建饼图。首先,我们需要将数据集传递给饼布局的.pie()方法:

var pieData = pieLayout(dataset);

接着,我们需要创建一个容器来放置饼图,并在其中添加相应的SVG路径元素。对于每个数据对象,我们使用弧生成器(arc generator)来创建一个SVG路径(path),然后使用颜色比例尺(color scale)为其设置相应的颜色:

var color = d3.scaleOrdinal(["#66c2a5", "#fc8d62", "#8da0cb", "#e78ac3"]);

var pieContainer = svg.append("g")
    .attr("transform", "translate(" + svgWidth / 2 + "," + svgHeight / 2 + ")");

pieContainer.selectAll(".arc")
    .data(pieData 
)
    .enter()
    .append("path")
    .attr("class", "arc")
    .attr("d", arcGenerator)
    .attr("fill", function (d, i) {
        return color(i);
    });

在这里,我们使用D3.js的.selectAll()方法选中所有具有.arc类(class)的元素,并绑定饼图数据,然后使用.enter()方法来添加新的SVG路径元素。最后,使用.attr()方法设置元素的属性,比如d属性为弧生成器返回的SVG路径字符串,fill属性为颜色比例尺返回的颜色值。

现在,我们已经成功地创建了一个基本的饼图,接下来让我们添加一些其他元素以使其更加完整。

步骤5 - 添加图例

我们可以通过添加图例来更好地说明饼图的含义。我们将使用数据集中每个数据对象的名称(name)和值(value)来创建图例。

首先,我们需要使用D3.js选择器方法.selectAll().data()来绑定图例数据:

var legend = svg.selectAll(".legend")
    .data(pieData)
    .enter()
    .append("g")
    .attr("class", "legend")
    .attr("transform", function (d, i) {
        var x = svgWidth - 100;
        var y = 20 + i * 25;
        return "translate(" + x + "," + y + ")";
    });

在这里,我们创建了一个包含每个图例项的SVG分组元素(g)。我们通过指定class属性为.legend来将其与其他SVG元素区分开来,然后使用.attr()方法设置图例项在SVG中的位置。

接着,我们在每个分组元素中添加一个矩形(rectangle)和一个文本(text)元素,用于显示图例项的颜色和名称/值:

legend.append("rect")
    .attr("width", 20)
    .attr("height", 10)
    .attr("y", 5)
    .attr("fill", function (d, i) {
        return color(i);
    });

legend.append("text")
    .attr("x", 30)
    .attr("y", 15)
    .text(function (d) {
        return d.data.name + ":" + d.data.value;
    });

在这里,我们使用.append()方法在每个分组元素中添加矩形和文本元素,并使用.attr()方法设置其属性,比如矩形的宽度、高度、y轴偏移量和填充颜色(color),以及文本的x轴和y轴偏移量,以及文本内容。其中文本内容使用了数据对象的名称(name)和值(value)属性来构建。

至此,我们已经成功地创建了一个基本的饼图,并添加了一些元素以增加其可读性和可视化效果。这只是D3.js的一个简单示例,实际上它还可以用于创建各种类型的数据可视化,包括折线图、柱状图、散点图等。

image.png

在线地址:https://scqilin.github.io/d3js/basic-chart/index.html