使用D3.J创建交互式图表
#javascript #网络开发人员 #教程 #d3

带有Codepen表示的原始帖子:Creating Interactive Charts with D3.js

d3(数据驱动文档的缩写)是一个JavaScript库,可让您为Web创建交互式数据可视化。使用D3,您可以创建各种可视化范围,从简单的图表和图形到复杂的交互式图形。

在本教程中,我们将研究如何使用D3创建简单的条形图。我们将从基本的条形图开始,然后通过更新图表数据并在用户徘徊在栏上时的标签来添加交互。

首先,让我们为图表设置HTML。我们将包含一个带有“图表”的ID的DIV元素,以及一个脚本标签,其中包括D3库:

<html>
<head>
    <script src="https://d3js.org/d3.v6.min.js"></script>
    <style>
      body {
        overflow: scroll;
      }
      #chart {
        display: grid;
        grid-template-columns: 1fr;
        height: 100vh;
        width: 100vw;
        justify-items: center;
        align-items: center;
      }
    </style>
</head>
<body>
<div id="chart"></div>
<script>
 <!-- the chart logic goes here! -->
</script>
</body>
</html>

接下来,让我们为图表定义数据。我们将使用一系列对象,每个对象代表图表中的条形。每个对象都应具有名称和值属性:

const data = [
  { name: 'Alice', value: 100 },
  { name: 'Bob', value: 75 },
  { name: 'Eve', value: 50 },
  { name: 'Mike', value: 0 }
];

现在,让我们设置将包含我们图表的SVG元素。我们将指定图表的宽度和高度以及条之间的填充。我们还将定义X轴的比例,该量表将确定每个条的宽度:

const height = 300;
const barPadding = 10;
const barWidth = 30;

const xScale = d3.scaleLinear()
  .domain([0, d3.max(data, d => d.value)]) //from 0 to the greatest value (100)
  .range([0, width]); // make the width of the svg fit the chart

const yScale = d3.scaleLinear()
  .domain([0, d3.max(data, d => d.value)])
  .range([height, 0]);

const xAxis = d3.axisBottom(xScale);
const yAxis = d3.axisLeft(yScale);

const svg = d3
  .select('#chart')
  .append('svg')
  .attr('width', width+35)// add 35 to fit the xAxis
  .attr('height', height+35) // add 35 to fit the yAxis

现在,让我们为我们的图表创建标准。我们将使用rect元素来创建条形,并使用数据功能将数据绑定到它们。我们还将指定条形的X和Y位置以及它们的宽度和高度:

svg
  .selectAll('rect')
  .data(data)
  .enter()
  .append('rect')
  .attr('x', (d, i) => i * (barWidth + barPadding))
  .attr('y', (d) => yScale(d.value))
  .attr('width', barWidth)
  .attr('height', (d) => height - yScale(d.value))
  .attr('fill', '#2196f3')

接下来,让我们将交互性添加到我们的图表中。我们将在酒吧中添加鼠标和鼠标局事件,并在用户徘徊在栏上时更新图表数据和标签。

.on('mouseover', function(d, i) {  // Add a mouseover event to the bars
  d3.select(this).style('opacity', 0.5);// change opacity
  svg
    .selectAll('text')
    .filter((d, j) => d===i)// select the text related to the bar
    .text(i.name);  // Change the text from value to name
})
.on('mouseout', function(d, i) {  // Add a mouseout event to the bars
  // reverse everything
  d3.select(this).style('opacity', 1);
  svg
    .selectAll('text')
    .filter((d, j) => d===i)
    .text(i.value); 
})
.attr('transform', `translate(25, 10)`)

现在,让我们为我们的图表添加标签。我们将使用文本元素来创建标签,并使用数据功能将数据绑定到它们。我们还将指定标签的X和Y位置:

svg
  .selectAll('text')
  .data(data)
  .enter()
  .append('text')
  .text((d) => d.value)
  .attr('x', (d, i) => i * (barWidth + barPadding) + barWidth / 2)
  .attr('y', (d) => yScale(d.value) )
  .attr('text-anchor', 'middle')
  .attr('font-size', '14px')
  .attr('fill', 'black')
  .on('mouseover', function(d, i) {  // Add a mouseover event to the text

    // this: refers to the text. this.parentNode: refers to the whole SVG
    d3.select(this).text(i.name); // change text from value to name

  })
  .on('mouseout', function(d, i) {  // Add a mouseout event to the text
    d3.select(this).text(i.value);
  })
  .attr('transform', `translate(25, 10)`)

最后,让我们将X和Y轴添加到我们的图表中。我们将使用G元素将X和Y轴分组,并将调用功能渲染:

svg
  .append('g')
  .attr('transform', `translate(25, ${height+10})`)
  .call(xAxis);

svg
  .append('g')
  .attr('transform', `translate(25, 10)`)
  .call(yAxis);

就是这样!现在,您使用D3.js。

值得注意的是,那里有许多库可以为您创建图表和图形,例如Chart.js,HighCharts和Google图表。但是,D3.js提供了很多灵活性和自定义选项,使您可以精确地创建Web应用程序所需的图表。

我希望本教程能帮助您开始使用D3.js创建交互式图表。与往常一样,如果您有任何疑问或需要进一步的指导,请不要犹豫。愉快的编码!