javascript - ChartJS 自定义图例甜甜圈将图例与图表区域分开
问题描述
我试图在ChartJS图表中将Legend
与我分开。使用“默认”图例时,无法控制图表区域大小,并且图例中的项目越多,它就会变得越小......Chart
如果可以在Legend
不改变Chart Area
大小的情况下扩展,我很想听听任何这样做的人:)
我正在尝试的另一个选项是创建一个自定义Legend
并将其插入为 innerHTML,并隐藏默认图例。
我尝试过使用以下解决方案legendCallback
:
但他们都对我不起作用......不知道为什么,我已经完全按照他们指定的方式完成了。
我认为这可能是ChartJS
(我正在使用最新的)版本或其他一些数据问题阻止了图例的显示。
我的代码:
var chart1 = document.getElementById('displayVals').getContext('2d');
var mychart1 = new Chart(chart1, {
type: 'doughnut',
data: {
labels: namelist,
datasets: [{
label: 'Doughnut Chart :)',
data: valuelist,
backgroundColor: GraphColors,
borderWidth: 0
}]
},
options: {
layout: {
padding: chartPadding
},
responsive: true,
maintainAspectRatio: false,
legend: {
display: false
},
legendCallback: function (chart) {
var text = [];
text.push('<ul class="0-legend">');
var ds = chart.data.datasets[0];
var sum = ds.data.reduce(function add(a, b) { return a + b; }, 0);
for (var i = 0; i < ds.data.length; i++) {
text.push('<li>');
var perc = Math.round(100 * ds.data[i] / sum, 0);
text.push('<span style="background-color:' + ds.backgroundColor[i] + '">' + '</span>' + chart.data.labels[i] + ' (' + ds.data[i] + ') (' + perc + '%)');
text.push('</li>');
}
text.push('</ul>');
return text.join("");
},
plugins: {
title: {
display: true,
text: 'Names',
color: titleColor,
padding: titlePadding,
font: {
family: fontFamily,
size: fontSize,
style: fontStyle
}
}
}
}
})
var myLegendContainer = document.getElementById("legend1");
myLegendContainer.innerHTML = mychart1.generateLegend();
和html:
<div class="container">
<div class="row">
<div class="col-4">
<div>
<canvas class="doughnutChart" id="displayVals"></canvas>
</div>
<div id="legend1">test</div>
</div>
</div>
我可以在 中显示“测试”这个词,但仅此而已......
有任何想法吗..?
解决方案
Legends 命名空间在 V3 中已更改,现在已在plugins
部分中配置,您还配置了标题。
要实现外部图例,您需要使用自定义插件,您还需要在插件部分进行配置。
您可以从这个官方示例中复制粘贴插件:https ://www.chartjs.org/docs/master/samples/legend/html.html
您需要配置的唯一内容是:
- 对于内部图例插件,您需要禁用它
- 对于自定义图例插件,您需要为其提供生成图例所需的 div 的 ID。
推荐阅读
- python-3.x - 如何检查特定的 IP 地址属于 PySpark 数据帧中的哪个范围?
- python - 无法在 python 中导入 timezonefinder
- c++ - 如何将多个 QJsonObject 添加到 QJsonDocument - Qt
- vue.js - $router.push 刷新页面并丢失数据
- python - 选择器爬取无结果
- laravel - Laravel 策略 ID 混淆
- angular - NgBootstrap 模式未打开
- c++ - 在独立语句中将新对象存储在智能指针中
- python - 列表 Python 中的最小和最大总和
- tensorflow.js - 加载保存的模型会导致 tfjs 中出现“'getIndices':找不到匹配的重载函数”