Den*_*vic 4 javascript vue.js chart.js vue-chartjs
I need to create custom legend for my donut chart using ChartJS library. I have created donut with default legend provided by ChartJS but I need some modification.
I would like to have value above the car name. Also I don't like sticky legend I want to have it separate from donut so I can change the style for fonts, boxes (next to the text "Audi" for example)
我知道有一些Legend 生成器,但我不确定如何将它与 VueJS 一起使用 - 因为我使用 VueJS 作为框架
这就是我的传奇现在的样子 - http://imgur.com/a/NPUoi
我的代码:
从我导入甜甜圈组件的 Vue 组件:
<div class="col-md-6">
<div class="chart-box">
<p class="chart-title">Cars</p>
<donut-message id="chart-parent"></donut-message>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
Javascript:
import { Doughnut } from 'vue-chartjs'
export default Doughnut.extend({
ready () {
Chart.defaults.global.tooltips.enabled = false;
Chart.defaults.global.legend.display = false;
this.render({
labels: ['Audi','BMW','Ford','Opel'],
datasets: [
{
label: 'Cars',
backgroundColor: ['#35d89b','#4676ea','#fba545','#e6ebfd'],
data: [40, 30, 20, 10]
}
]
},
{
responsive: true,
cutoutPercentage: 75,
legend: {
display: true,
position: "right",
fullWidth: true,
labels: {
boxWidth: 10,
fontSize: 14
}
},
animation: {
animateScale: true
}
})
}
});
Run Code Online (Sandbox Code Playgroud)
我在尝试理解文档时遇到了同样的问题,此链接可能会阐明自定义图例的过程:
https://codepen.io/michiel-nuovo/pen/RRaRRv
诀窍是跟踪回调以构建您自己的 HTML 结构并将这个新结构返回给 ChartJS。
在选项对象中:
legendCallback: function(chart) {
var text = [];
text.push('<ul class="' + chart.id + '-legend">');
for (var i = 0; i < chart.data.datasets[0].data.length; i++) {
text.push('<li><span style="background-color:' +
chart.data.datasets[0].backgroundColor[i] + '">');
if (chart.data.labels[i]) {
text.push(chart.data.labels[i]);
}
text.push('</span></li>');
}
text.push('</ul>');
return text.join("");
}
Run Code Online (Sandbox Code Playgroud)
其次,您需要一个容器来插入新的 html 并使用myChart.generateLegend()方法来获取自定义的 html:
$("#your-legend-container").html(myChart.generateLegend());
Run Code Online (Sandbox Code Playgroud)
之后,如果需要,请跟踪事件:
$("#your-legend-container").on('click', "li", function() {
myChart.data.datasets[0].data[$(this).index()] += 50;
myChart.update();
console.log('legend: ' + data.datasets[0].data[$(this).index()]);
});
$('#myChart').on('click', function(evt) {
var activePoints = myChart.getElementsAtEvent(evt);
var firstPoint = activePoints[0];
if (firstPoint !== undefined) {
console.log('canvas: ' +
data.datasets[firstPoint._datasetIndex].data[firstPoint._index]);
}
else {
myChart.data.labels.push("New");
myChart.data.datasets[0].data.push(100);
myChart.data.datasets[0].backgroundColor.push("red");
myChart.options.animation.animateRotate = false;
myChart.options.animation.animateScale = false;
myChart.update();
$("#your-legend-container").html(myChart.generateLegend());
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的另一个解决方案,如果您不需要更改图例中的 HTMl 结构,您只需在图例容器中插入相同的 HTML 并通过 CSS 对其进行自定义,请查看另一个链接:
希望对你有效。
小智 -5
请检查此文档 。
图例配置
图表图例显示有关图表上出现的数据集的数据。
配置选项 图例的位置。选项有:
‘上’‘左’‘下’‘右’
图例项目界面
传递给图例 onClick 函数的项目是从 labels.generateLabels 返回的项目。这些项目必须实现以下接口。
{
// Label that will be displayed
text: String,
// Fill style of the legend box
fillStyle: Color,
// If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect
hidden: Boolean,
// For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap
lineCap: String,
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash
lineDash: Array[Number],
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset
lineDashOffset: Number,
// For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
lineJoin: String,
// Width of box border
lineWidth: Number,
// Stroke style of the legend box
strokeStyle: Color
// Point style of the legend box (only used if usePointStyle is true)
pointStyle: String
}
Run Code Online (Sandbox Code Playgroud)
例子
以下示例将创建一个启用图例的图表,并将所有文本变为红色。
var Chart = new Chart(ctx, { type: 'bar', data: data, options: { legend: { display: true, labels: { fontColor: 'rgb(255, 99, 132)' } } } }); 自定义点击操作
单击图例中的项目时想要触发不同的行为是很常见的。这可以使用配置对象中的回调轻松实现。
默认图例单击处理程序是:
function(e, legendItem) {
var index = legendItem.datasetIndex;
var ci = this.chart;
var meta = ci.getDatasetMeta(index);
// See controller.isDatasetVisible comment
meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;
// We hid a dataset ... rerender the chart
ci.update();
}
Lets say we wanted instead to link the display of the first two datasets. We could change the click handler accordingly.
var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
var index = legendItem.datasetIndex;
if (index > 1) {
// Do the original logic
defaultLegendClickHandler(e, legendItem);
} else {
let ci = this.chart;
[ci.getDatasetMeta(0),
ci.getDatasetMeta(1)].forEach(function(meta) {
meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;
});
ci.update();
}
};
var chart = new Chart(ctx, {
type: 'line',
data: data,
options: {
legend: {
}
}
});
Run Code Online (Sandbox Code Playgroud)
现在,当您单击此图表中的图例时,前两个数据集的可见性将链接在一起。
HTML 图例
有时您需要非常复杂的图例。在这些情况下,生成 HTML 图例是有意义的。图表在其原型上提供了一个generateLegend()方法,该方法返回图例的HTML字符串。
要配置此图例的生成方式,您可以更改 legendCallback 配置属性。
var chart = new Chart(ctx, {
type: 'line',
data: data,
options: {
legendCallback: function(chart) {
// Return the HTML string here.
}
}
});
Run Code Online (Sandbox Code Playgroud)