
本教程详细介绍了如何在 chart.js 中实现条形图和折线图等多图表类型的组合,并为它们配置独立的多 y 轴及正确的标签显示。文章将重点讲解 `yaxisid` 与 `scales` 配置的对应关系,以及如何通过设置 `display` 和 `position` 属性来确保轴标签的正确呈现,从而解决多轴图表显示不准确的问题。
引言:Chart.js 多轴图表的应用场景
Chart.js 是一个功能强大且易于使用的 JavaScript 图表库,广泛应用于网页数据可视化。在实际应用中,我们经常需要在一个图表中展示不同类型的数据,这些数据可能具有不同的量纲或数值范围,例如同时展示网站的访问量(Visitor)和销售额(Sales)。在这种情况下,使用单一的 Y 轴会导致数据展示不清晰甚至误导。多 Y 轴图表允许我们为不同的数据集配置独立的 Y 轴,从而在同一图表中清晰地呈现多维数据。
然而,在 Chart.js 中配置多 Y 轴时,尤其是在同时使用多种图表类型(如条形图和折线图)时,轴标签的正确显示和位置调整常常成为一个挑战。本教程将深入探讨如何正确配置 Chart.js 的 options.scales,以实现多图表类型的多 Y 轴及其标签的精准控制。
核心概念:Chart.js 轴配置
在 Chart.js 中,实现多 Y 轴的关键在于理解数据集(datasets)与轴配置(options.scales)之间的关联。
1. 数据集与 Y 轴的关联 (yAxisID)
每个数据集对象都包含一个 yAxisID 属性,用于指定该数据集应绑定到哪个 Y 轴。这个 ID 必须与 options.scales 中定义的某个 Y 轴的 id 严格匹配。
// 示例:数据集配置
datasets: [{
type: 'bar',
label: "Visitor",
data: [200, 185, 590, 621, 250, 400, 95],
yAxisID: 'y-axis-1' // 绑定到 ID 为 'y-axis-1' 的 Y 轴
}, {
label: "Sales",
type:'line',
data: [51, 65, 40, 49, 60, 37, 40],
yAxisID: 'y-axis-2' // 绑定到 ID 为 'y-axis-2' 的 Y 轴
}]2. 全局轴配置 (options.scales)
options.scales 是 Chart.js 中配置所有 X 轴和 Y 轴的核心。在 Chart.js v2.x 中,scales 是一个对象,其属性名可以直接是轴的 ID。
每个轴配置对象包含以下关键属性:
- id: 轴的唯一标识符,必须与数据集中的 yAxisID 匹配。
- type: 轴的类型,对于数值轴通常设置为 "linear"。
- position: 轴在图表中的位置,对于 Y 轴可以是 "left" 或 "right"。
- display: 一个布尔值,控制轴及其标签是否在图表中显示。这是解决轴标签不显示问题的关键。将其设置为 true 才能看到轴和标签。
- gridLines: 用于配置轴的网格线。
- labels.show: (Chart.js v2.x) 控制轴标签(刻度值)是否显示。在 Chart.js v3+ 中,此功能被 ticks.display 替代。
实现步骤:构建多轴组合图表
我们将通过一个具体的例子来演示如何实现一个包含条形图和折线图,并带有两个独立 Y 轴的 Chart.js 图表。
1. HTML 准备
首先,在 HTML 页面中创建一个 canvas> 元素作为图表的容器,并引入 Chart.js 库。为了兼容本教程中的代码示例,我们使用 Chart.js v2.9.4。
Chart.js 多轴图表示例
2. 数据结构定义
定义图表的数据,包括标签(labels)和数据集(datasets)。注意在 datasets 中为每个数据系列指定 type 和 yAxisID。
此外,为了演示自定义样式,我们添加一个 createDiagonalPattern 函数来生成斜线填充模式。
// 用于创建对角线图案的辅助函数
function createDiagonalPattern(color = 'black') {
let shape = document.createElement('canvas');
shape.width = 10;
shape.height = 10;
let c = shape.getContext('2d');
c.strokeStyle = color;
c.beginPath();
c.moveTo(2, 0);
c.lineTo(10, 8);
c.stroke();
c.beginPath();
c.moveTo(0, 8);
c.lineTo(2, 10);
c.stroke();
return c.createPattern(shape, 'repeat');
}
var barChartData = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
type: 'bar',
label: "Visitor",
data: [200, 185, 590, 621,










