我试图创建一个ChartJS图例,它为每个标签显示一条中心有一个点的线,这样你就可以通过特定样式的线和点的类型来识别图例中的数据集。
到目前为止,我已经能够使用数据集中的单个点作为图例标签,或者通过使用自定义的generateLabels
函数显示一条没有额外点的样式线。
小提琴:https://jsfiddle.net/gpkdvjb5/33/
我使用的ChartJS版本是v3.9.1。
const NUM_DATA = 7;
const NUM_CFG = {count: NUM_DATA, min: 0, max: 100};
const data = {
labels: ['a','b','c','d','e','f','g'],
datasets: [
{
label: 'Dataset: 1',
data: [100, 150, 150, 100, 150, 150, 100],
pointRadius: 10,
pointStyle: 'rect',
borderDash: [5,18],
borderColor: 'blue',
backgroundColor: 'red',
fill: false,
},
{
label: 'Dataset: 1',
data: [200, 170, 170, 200, 170, 170, 200],
borderDash: [5,5,5],
pointRadius: 10,
borderColor: 'blue',
pointStyle: 'crossRot',
backgroundColor: 'blue',
fill: false,
},
],
};
const config = {
type: 'line',
data: data,
options: {
plugins: {
legend: {
labels: {
usePointStyle: true
}
}
}
},
};
config.options.plugins.legend.labels.pointStyleWidth = 60;
// Using line styling for labels instead of points
config.options.plugins.legend.labels.generateLabels = (chart) => {
const datasets = chart.data.datasets;
const options = chart.options.legend || {};
return chart._getSortedDatasetMetas().map((meta) => {
const style = meta.controller.getStyle();
return {
text: datasets[meta.index].label,
fillStyle: style.backgroundColor,
hidden: !meta.visible,
lineCap: style.borderCapStyle,
lineDash: style.borderDash,
lineDashOffset: style.borderDashOffset,
lineJoin: style.borderJoinStyle,
lineWidth: style.borderWidth,
strokeStyle: style.borderColor,
pointStyle: 'line',
rotation: style.rotation,
// Below is extra data used for toggling the datasets
datasetIndex: meta.index
};
});
};
let canvas = document.getElementById('test-canvas');
let chart = new Chart(
canvas,
config
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.js"></script>
<canvas id="test-canvas"></canvas>
1条答案
按热度按时间kulphzqa1#
您可以使用
generateLabels
函数返回的标签的pointStyle
的HTMLCanvasElement
选项创建自定义图例标签。该技术在代码中的简化应用如下: