我们几个月来一直在使用Chart.js,就像它给我们提供了易于编程的能力。我们想要开始添加到Chart.js生成的图表中的一件事是我们生成的图表的一个更好的样式。我们使用的大部分图表都是条形图,其中插入了一些折线图。
当我使用术语“造型”时,我真正在谈论的是使条形或线条看起来更好一些。具体来说,我想在条形图和折线图后面添加一个投影,甚至可能是对条形图的斜角。
我看了很多问题,似乎无法找到我想要的东西。我也通过修改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上的每个人的帮助,我都能够完成相当多的编码。
答案 0 :(得分:10)
您可以扩展折线图类型以执行此操作
预览强>
<强>脚本强>
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
});
答案 1 :(得分:5)
<强>ᴘʀᴇᴠɪᴇᴡ强>
ꜱᴄʀɪᴘᴛ 覆盖绘制功能
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>
答案 2 :(得分:0)
这适用于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);
});