要反转图例标签单击的行为,您可以使用图例onClick
实现新点击逻辑的选项。下面是一个示例,它将为您提供所需的行为。请注意,在此实现中,如果您单击已经隐藏的标签,它将取消隐藏它,并隐藏所有其他标签。
function(e, legendItem) {
var index = legendItem.datasetIndex;
var ci = this.chart;
var alreadyHidden = (ci.getDatasetMeta(index).hidden === null) ? false : ci.getDatasetMeta(index).hidden;
ci.data.datasets.forEach(function(e, i) {
var meta = ci.getDatasetMeta(i);
if (i !== index) {
if (!alreadyHidden) {
meta.hidden = meta.hidden === null ? !meta.hidden : null;
} else if (meta.hidden === null) {
meta.hidden = true;
}
} else if (i === index) {
meta.hidden = null;
}
});
ci.update();
};
这里有一个工作示例 http://codepen.io/jordanwillis/pen/BWKKKo以及。
但是,如果您想要一种更复杂的逻辑,当至少一个其他标签当前可见时,该逻辑将取消隐藏当前隐藏的标签,那么您可以使用以下实现。
function(e, legendItem) {
var index = legendItem.datasetIndex;
var ci = this.chart;
var alreadyHidden = (ci.getDatasetMeta(index).hidden === null) ? false : ci.getDatasetMeta(index).hidden;
var anyOthersAlreadyHidden = false;
var allOthersHidden = true;
// figure out the current state of the labels
ci.data.datasets.forEach(function(e, i) {
var meta = ci.getDatasetMeta(i);
if (i !== index) {
if (meta.hidden) {
anyOthersAlreadyHidden = true;
} else {
allOthersHidden = false;
}
}
});
// if the label we clicked is already hidden
// then we now want to unhide (with any others already unhidden)
if (alreadyHidden) {
ci.getDatasetMeta(index).hidden = null;
} else {
// otherwise, lets figure out how to toggle visibility based upon the current state
ci.data.datasets.forEach(function(e, i) {
var meta = ci.getDatasetMeta(i);
if (i !== index) {
// handles logic when we click on visible hidden label and there is currently at least
// one other label that is visible and at least one other label already hidden
// (we want to keep those already hidden still hidden)
if (anyOthersAlreadyHidden && !allOthersHidden) {
meta.hidden = true;
} else {
// toggle visibility
meta.hidden = meta.hidden === null ? !meta.hidden : null;
}
} else {
meta.hidden = null;
}
});
}
ci.update();
}
这里有一个工作示例 http://codepen.io/jordanwillis/pen/QpNoYJ对于这个替代实现也是如此。
要在您的特定代码中使用它,只需使用以下命令将其放置在图表的图例配置中onClick
财产。
var config = {
type: 'radar',
data: chartata,
animationEasing: 'linear',
options: {
legend: {
fontSize: 10,
display: true,
itemWidth: 150,
position: 'bottom',
fullWidth: true,
labels: {
fontColor: 'rgb(0,0,0)',
boxWidth: 10,
padding: 20
},
onClick: function(e, legendItem) {
var index = legendItem.datasetIndex;
var ci = this.chart;
var alreadyHidden = (ci.getDatasetMeta(index).hidden === null) ? false : ci.getDatasetMeta(index).hidden;
ci.data.datasets.forEach(function(e, i) {
var meta = ci.getDatasetMeta(i);
if (i !== index) {
if (!alreadyHidden) {
meta.hidden = meta.hidden === null ? !meta.hidden : null;
} else if (meta.hidden === null) {
meta.hidden = true;
}
} else if (i === index) {
meta.hidden = null;
}
});
ci.update();
},
},
tooltips: {
enabled: true
},
scale: {
ticks: {
fontSize: 15,
beginAtZero: true,
stepSize: 1,
max: 5
}
}
},
},
目前尚不清楚您希望“全部”选项具有什么行为,但您might能够使用legend.labels.generateLabels
欺骗 Chart.js 添加“全部”标签的选项(您必须修改上面的内容onClick
处理这个想法的逻辑。
但是,我认为更好的解决方案是在 Chart.js 画布之外实现您自己的链接或按钮,以显示/隐藏所有数据集。查看Chart.js 雷达示例页面 https://github.com/chartjs/Chart.js/blob/master/samples/radar/radar.html看看他们如何将按钮与图表操作绑定。