我在本地文件夹中有一个现有的svg图标。我想用chart.js绘制一个图表。现在我可以画出来了。
Demo
但我想在刻度文本旁边添加图标。在这个例子中,我想添加一个图标的权利,以文本“X轴”的x轴和相同的图标上方的文本“Y轴”。在网上很难找到这样的例子。
我的代码:
import { Component, VERSION } from '@angular/core';
import { ChartOptions, TooltipItem, Chart } from 'chart.js';
import { filter } from 'rxjs/operators';
const labels = [
'Jan',
'Feb',
'Mar',
'april',
'may',
'jun',
'july',
'aug',
'sept'
];
const tooltipPlugin = Chart.registry.getPlugin('tooltip') as any;
tooltipPlugin.positioners.verticallyCenter = (elements, position) => {
if (!elements.length) {
return tooltipPlugin.positioners.average(elements);
}
const { x, y, base, width } = elements[0].element;
const height = (base - y) / 2;
const offset = x + width / 2;
return {
x: offset,
y: y + height
};
};
const data = {
labels: labels,
datasets: [
{
maxBarThickness: 40,
label: '',
data: [50, 20, 30, 75, 30, 60, 70, 80, 100],
backgroundColor: 'red'
}
]
};
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
name = 'Angular ' + VERSION.major;
data = data;
options: ChartOptions = {
aspectRatio: 2,
layout: {
padding: {
top: 0
}
},
responsive: true,
maintainAspectRatio: true,
scales: {
y: {
title: {
display: true,
text: 'Y Axis'
},
axis: 'y',
grid: {
display: false,
drawTicks: false,
tickLength: 0
},
max: 100,
ticks: {
major: {
enabled: false
},
padding: 17,
stepSize: 25,
callback: (value, index, ticks) => {
return index === 0 || index === ticks.length - 1 ? '' : `${value}%`;
}
},
afterTickToLabelConversion: first => {
console.log(first);
}
},
x: {
title: {
display: true,
text: 'X Axis'
},
axis: 'x',
grid: { drawTicks: false },
ticks: {
padding: 17
}
}
},
plugins: {
tooltip: {
position: 'verticallyCenter' as 'average',
animation: { duration: 0 },
callbacks: {
title: (context: TooltipItem<'bar'>[]) => {
console.log(context[0].label);
return context[0].label;
}
}
},
legend: {
display: false,
position: 'bottom'
},
title: {
display: false
}
}
};
}
1条答案
按热度按时间dy2hfwbg1#
在chart.js中绘制svg相对容易,可以这样做:
其中,对2D上下文
ctx
的访问作为图表或缩放对象(chart.ctx
或scale.ctx
)的属性在各种chart.js处理程序中可用。更深入地了解所提出的解决方案的细节,我们定义(对于一个svg图像)一个对象
svgDrawPositions
,它包含(可能多个)所需渲染的细节:绘制位置索引的
id
s,在这个特定的情况下,是轴的id,因为svg要为两个轴中的每一个显示。稍后我们将讨论
x
、y
、rotation
、h
的计算方法。现在,我们将认为它们已经可用。然后,svg的实际绘制可以通过一个简单的插件完成,只需一个afterDraw
方法:我们只需要
svgDrawPositions
中svg渲染的高度,因为我们使用实际svg的纵横比来计算宽度。现在,真实的困难是如何设置渲染的位置。这是因为坐标轴的标题是少数几个其呈现细节未在图表对象中公开的项目之一。坐标轴、刻度、刻度标签、网格线都在图表对象中有其实时信息,但坐标轴标题不在那里。解决这个问题的方法不是很好,它包括复制与轴标题定位相关的chart.js的源代码。
然后,该框架是自定义缩放类的框架:
this stackblitz fork中的代码使用了原始的chart.js 3.3.2,而下面的代码片段演示(无Angular )基于最新版本4.3.3