使用 Chart.js 设计条形和线条
Styling Bars and Lines with Chart.js
我们已经使用 Chart.js 几个月了,并且喜欢它为我们提供的易于编程的功能。我们想要开始添加到从 Chart.js 生成的图表中的一件事是我们生成的图表的样式更好一些。我们使用的大部分图表是条形图,还有一些折线图。
当我使用术语 "styling" 时,我真正在谈论的是让条形图或线条看起来更漂亮一些。具体来说,我想在条形图和折线图后面添加一个阴影,甚至可能在条形图上添加一个斜角。
我已经查看了很多问题,但似乎找不到我要找的东西。我也通过修改 Chart.js 文件来为 javascript 添加投影和模糊来自己做一些实验,但我没有将它添加到正确的位置。我将这些更改放在 Chart.Element.extend 绘图函数中:
ctx.shadowColor = '#000';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 8;
ctx.shadowOffsetY = 8;
我把它放在 ctx.fill() 之前,它几乎可以满足我的要求。结果是我在绘制的条形图和折线图上得到了一个看起来不错的阴影,但在 x 轴和 y 轴的标签上也得到了一个看起来不太好的阴影。我只想在条形和线条上有阴影,而不是在标签上。
如果您能提供任何帮助,我们将不胜感激。我对 javascript 没有经验,但已经能够完成相当多的编码,如果没有 Stack Overflow 上每个人的帮助,我将无法完成。
为折线图添加阴影
您可以扩展折线图类型来执行此操作
预览
脚本
Chart.types.Line.extend({
name: "LineAlt",
initialize: function () {
Chart.types.Line.prototype.initialize.apply(this, arguments);
var ctx = this.chart.ctx;
var originalStroke = ctx.stroke;
ctx.stroke = function () {
ctx.save();
ctx.shadowColor = '#000';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 8;
ctx.shadowOffsetY = 8;
originalStroke.apply(this, arguments)
ctx.restore();
}
}
});
然后
...
var myChart = new Chart(ctx).LineAlt(data, {
datasetFill: false
});
Fiddle - https://jsfiddle.net/7kbz1L4t/
..
ᴘʀᴇᴠɪᴇᴡ
ꜱᴄʀɪᴘᴛ‹重写绘制函数
let draw = Chart.controllers.line.prototype.draw;
Chart.controllers.line.prototype.draw = function() {
draw.apply(this, arguments);
let ctx = this.chart.chart.ctx;
let _stroke = ctx.stroke;
ctx.stroke = function() {
ctx.save();
ctx.shadowColor = '#07C';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 4;
_stroke.apply(this, arguments);
ctx.restore();
}
};
let draw = Chart.controllers.line.prototype.draw;
Chart.controllers.line.prototype.draw = function() {
draw.apply(this, arguments);
let ctx = this.chart.chart.ctx;
let _stroke = ctx.stroke;
ctx.stroke = function() {
ctx.save();
ctx.shadowColor = '#07C';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 4;
_stroke.apply(this, arguments);
ctx.restore();
}
};
let ctx = document.querySelector("#canvas").getContext('2d');
let myChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
data: [65, 59, 75, 64, 70, 30, 40],
borderColor: '#07C',
pointBackgroundColor: "#FFF",
pointBorderColor: "#07C",
pointHoverBackgroundColor: "#07C",
pointHoverBorderColor: "#FFF",
pointRadius: 4,
pointHoverRadius: 4,
fill: false,
tension: 0.15
}]
},
options: {
responsive: false,
tooltips: {
displayColors: false,
callbacks: {
label: function(e, d) {
return `${e.xLabel} : ${e.yLabel}`
},
title: function() {
return;
}
}
},
legend: {
display: false
},
scales: {
yAxes: [{
ticks: {
max: 90
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
<canvas id="canvas" width="400" height="210" style="background-color: #E4E8F0"></canvas>
这适用于新版 Chart JS
我们可以创建一个插件对象并注册到图表 JS,插件是开发人员在创建图表时修改图表的一种方式,参考
https://riptutorial.com/chart-js/example/22332/plugins-introduction
向任何图表添加阴影的示例插件
var simpleplugin = {
beforeDraw : function(chartInstance)
{
let _stroke = chartInstance.ctx.stroke;
chartInstance.ctx.stroke = function () {
chartInstance.ctx.save();
chartInstance.ctx.shadowColor = 'gray';
chartInstance.ctx.shadowBlur = 10;
chartInstance.ctx.shadowOffsetX = 2;
chartInstance.ctx.shadowOffsetY = 2;
_stroke.apply(this, arguments)
chartInstance.ctx.restore();
}
let _fill = chartInstance.ctx.fill;
ctx.fill = function () {
chartInstance.ctx.save();
chartInstance.ctx.shadowColor = 'gray';
chartInstance.ctx.shadowBlur = 10;
chartInstance.ctx.shadowOffsetX = 2;
chartInstance.ctx.shadowOffsetY = 2;
_fill.apply(this, arguments)
chartInstance.ctx.restore();
}
}
}
$(function()
{
Chart.pluginService.register(simpleplugin);
});
我们已经使用 Chart.js 几个月了,并且喜欢它为我们提供的易于编程的功能。我们想要开始添加到从 Chart.js 生成的图表中的一件事是我们生成的图表的样式更好一些。我们使用的大部分图表是条形图,还有一些折线图。
当我使用术语 "styling" 时,我真正在谈论的是让条形图或线条看起来更漂亮一些。具体来说,我想在条形图和折线图后面添加一个阴影,甚至可能在条形图上添加一个斜角。
我已经查看了很多问题,但似乎找不到我要找的东西。我也通过修改 Chart.js 文件来为 javascript 添加投影和模糊来自己做一些实验,但我没有将它添加到正确的位置。我将这些更改放在 Chart.Element.extend 绘图函数中:
ctx.shadowColor = '#000';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 8;
ctx.shadowOffsetY = 8;
我把它放在 ctx.fill() 之前,它几乎可以满足我的要求。结果是我在绘制的条形图和折线图上得到了一个看起来不错的阴影,但在 x 轴和 y 轴的标签上也得到了一个看起来不太好的阴影。我只想在条形和线条上有阴影,而不是在标签上。
如果您能提供任何帮助,我们将不胜感激。我对 javascript 没有经验,但已经能够完成相当多的编码,如果没有 Stack Overflow 上每个人的帮助,我将无法完成。
为折线图添加阴影
您可以扩展折线图类型来执行此操作
预览
脚本
Chart.types.Line.extend({
name: "LineAlt",
initialize: function () {
Chart.types.Line.prototype.initialize.apply(this, arguments);
var ctx = this.chart.ctx;
var originalStroke = ctx.stroke;
ctx.stroke = function () {
ctx.save();
ctx.shadowColor = '#000';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 8;
ctx.shadowOffsetY = 8;
originalStroke.apply(this, arguments)
ctx.restore();
}
}
});
然后
...
var myChart = new Chart(ctx).LineAlt(data, {
datasetFill: false
});
Fiddle - https://jsfiddle.net/7kbz1L4t/
..
ᴘʀᴇᴠɪᴇᴡ
ꜱᴄʀɪᴘᴛ‹重写绘制函数
let draw = Chart.controllers.line.prototype.draw;
Chart.controllers.line.prototype.draw = function() {
draw.apply(this, arguments);
let ctx = this.chart.chart.ctx;
let _stroke = ctx.stroke;
ctx.stroke = function() {
ctx.save();
ctx.shadowColor = '#07C';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 4;
_stroke.apply(this, arguments);
ctx.restore();
}
};
let draw = Chart.controllers.line.prototype.draw;
Chart.controllers.line.prototype.draw = function() {
draw.apply(this, arguments);
let ctx = this.chart.chart.ctx;
let _stroke = ctx.stroke;
ctx.stroke = function() {
ctx.save();
ctx.shadowColor = '#07C';
ctx.shadowBlur = 10;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 4;
_stroke.apply(this, arguments);
ctx.restore();
}
};
let ctx = document.querySelector("#canvas").getContext('2d');
let myChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
data: [65, 59, 75, 64, 70, 30, 40],
borderColor: '#07C',
pointBackgroundColor: "#FFF",
pointBorderColor: "#07C",
pointHoverBackgroundColor: "#07C",
pointHoverBorderColor: "#FFF",
pointRadius: 4,
pointHoverRadius: 4,
fill: false,
tension: 0.15
}]
},
options: {
responsive: false,
tooltips: {
displayColors: false,
callbacks: {
label: function(e, d) {
return `${e.xLabel} : ${e.yLabel}`
},
title: function() {
return;
}
}
},
legend: {
display: false
},
scales: {
yAxes: [{
ticks: {
max: 90
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
<canvas id="canvas" width="400" height="210" style="background-color: #E4E8F0"></canvas>
这适用于新版 Chart JS 我们可以创建一个插件对象并注册到图表 JS,插件是开发人员在创建图表时修改图表的一种方式,参考
https://riptutorial.com/chart-js/example/22332/plugins-introduction
向任何图表添加阴影的示例插件
var simpleplugin = {
beforeDraw : function(chartInstance)
{
let _stroke = chartInstance.ctx.stroke;
chartInstance.ctx.stroke = function () {
chartInstance.ctx.save();
chartInstance.ctx.shadowColor = 'gray';
chartInstance.ctx.shadowBlur = 10;
chartInstance.ctx.shadowOffsetX = 2;
chartInstance.ctx.shadowOffsetY = 2;
_stroke.apply(this, arguments)
chartInstance.ctx.restore();
}
let _fill = chartInstance.ctx.fill;
ctx.fill = function () {
chartInstance.ctx.save();
chartInstance.ctx.shadowColor = 'gray';
chartInstance.ctx.shadowBlur = 10;
chartInstance.ctx.shadowOffsetX = 2;
chartInstance.ctx.shadowOffsetY = 2;
_fill.apply(this, arguments)
chartInstance.ctx.restore();
}
}
}
$(function()
{
Chart.pluginService.register(simpleplugin);
});