📜  如何在 JS 中制作条形图 (1)

📅  最后修改于: 2023-12-03 14:52:22.551000             🧑  作者: Mango

如何在 JS 中制作条形图

在 Web 开发中,数据可视化是非常常见的需求。条形图是其中常用的一种,可以展示数据的大小、比较等信息。在本文中,我们将介绍如何使用 JavaScript 制作一个简单的条形图,并提供相关代码。

准备工作

在开始制作条形图前,需要准备好页面上的 DOM 元素,例如:

<div id="chart"></div>

同时,还需要准备好数据,例如:

const data = [
  { name: 'A', value: 20 },
  { name: 'B', value: 30 },
  { name: 'C', value: 50 },
]
创建 SVG 容器

使用 D3.js 可以轻松创建 SVG 图形。首先需要定义 SVG 容器的大小和边距:

const margin = { top: 10, right: 10, bottom: 20, left: 30 }
const width = 400 - margin.left - margin.right
const height = 200 - margin.top - margin.bottom

然后创建 SVG 容器:

const svg = d3.select('#chart')
  .append('svg')
  .attr('width', width + margin.left + margin.right)
  .attr('height', height + margin.top + margin.bottom)
  .append('g')
  .attr('transform', `translate(${margin.left}, ${margin.top})`)

这里使用了 D3.js 的链式语法,先选中了 ID 为 chart 的元素,然后追加了一个 SVG 元素,设置了宽高,并使用 translate 转换了坐标系。

创建比例尺

比例尺可以将数据值转换为坐标轴上的位置。由于条形图一般是在数值轴上展示数据,所以这里需要创建一个数值比例尺:

const x = d3.scaleLinear()
  .domain([0, d3.max(data.map(d => d.value))])
  .range([0, width])

这里使用了 D3.js 的 scaleLinear 方法创建一个数值比例尺,指定了数据值的范围和对应的坐标轴长度区间。

渲染条形图

接下来就可以开始绘制条形图了。首先需要创建一个 SVG rect 元素,然后根据数据值计算出对应的位置和宽度:

svg.selectAll('rect')
  .data(data)
  .enter()
  .append('rect')
  .attr('x', 0)
  .attr('y', (d, i) => i * 25)
  .attr('width', d => x(d.value))
  .attr('height', 20)

这里使用了 D3.js 的 selectAll 方法选中所有的 rect 元素,并使用数据绑定方法 data 将数据和每个 rect 绑定。然后使用 enter 方法获取所有缺失的元素,并追加新的 rect 元素。设置 xywidthheight 属性,完成绘制。

创建坐标轴

为了更好地展示数据,条形图一般需要配合坐标轴。这里创建一个简单的数值坐标轴:

const xAxis = d3.axisBottom(x)

svg.append('g')
  .attr('transform', `translate(0, ${height})`)
  .call(xAxis)

这里使用了 D3.js 的 axisBottom 方法创建一个数值坐标轴,并将比例尺传递给它。然后创建一个 g 元素,设置坐标轴的位置,最后调用 call 方法将坐标轴渲染到 SVG 容器中。

完整代码

下面是完整的代码片段:

const margin = { top: 10, right: 10, bottom: 20, left: 30 }
const width = 400 - margin.left - margin.right
const height = 200 - margin.top - margin.bottom

const data = [
  { name: 'A', value: 20 },
  { name: 'B', value: 30 },
  { name: 'C', value: 50 },
]

const x = d3.scaleLinear()
  .domain([0, d3.max(data.map(d => d.value))])
  .range([0, width])

const svg = d3.select('#chart')
  .append('svg')
  .attr('width', width + margin.left + margin.right)
  .attr('height', height + margin.top + margin.bottom)
  .append('g')
  .attr('transform', `translate(${margin.left}, ${margin.top})`)

svg.selectAll('rect')
  .data(data)
  .enter()
  .append('rect')
  .attr('x', 0)
  .attr('y', (d, i) => i * 25)
  .attr('width', d => x(d.value))
  .attr('height', 20)

const xAxis = d3.axisBottom(x)

svg.append('g')
  .attr('transform', `translate(0, ${height})`)
  .call(xAxis)
总结

在本文中,我们介绍了如何使用 JavaScript 和 D3.js 制作一个简单的条形图。通过掌握本文介绍的方法,可以进一步扩展和优化条形图的功能和效果,帮助用户更好地理解数据。