在 ChartJS 中突出显示最后单击的栏
Highlight last clicked bar in ChartJS
我正在尝试更改 ChartJS 中最后单击的栏的不透明度,然后在下一次单击另一个栏时将其设置为 'unhighlighted'。基本上是悬停的默认行为。请注意,这是一个堆叠条形图,我希望整个条形柱的不透明度都发生变化,而不是每个单独的部分。
我已经知道可以在单击时将背景颜色(不确定如何更改不透明度)更改为黑色,但单击下一个项目时它不会取消设置。因此,一旦所有内容都被点击,整个图表最终会变成黑色。
这是我目前使用的onclick代码:
var myChart = new Chart(ctx, {
type: 'bar',
data: data,
options: {
onClick: function(e){
myChart.update();
var element = this.getElementAtEvent(event)[0];
element.custom = element.custom || {};
element.custom.backgroundColor = '#000';
},
}
});
堆叠数据:
var data = {
"labels":["2011","2012","2013","2014","2015"],
"datasets":[
{
"label":"Total Fishermen",
"backgroundColor":"#518936",
"data":[991,1020,731,850,851]
},
{
"label":"Total Processing Employees",
"backgroundColor":"#82c6d4",
"data":[0,0,130,0,0]
},
{
"label":"Total Aquaculture Employees",
"backgroundColor":"#c0136b",
"data":[0,134,130,119,0]
}
]
};
任何帮助将不胜感激!
... but it does not unset when the next item is clicked.
您可以使用 active 属性 来获取活动的组元素并使用当前的 backgroundColor 添加 50% 的 transparency:
this.active.forEach(function(ele, idx) {
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var color = ele._model.backgroundColor.replace(')', ', 0.5)');
ele.custom.backgroundColor = color;
} else {
delete ele.custom.backgroundColor;
}
});
为了重置最后单击的元素,您可以在循环处理所有元素的 onClick 处理程序中执行此操作:
for(i=0; i<this.data.datasets.length; i++) {
this.getDatasetMeta(i).data.forEach(function(ele, idx) {
if (ele.custom != undefined)
delete ele.custom.backgroundColor;
});
}
Chart.pluginService.register({
afterInit: function (chart, options) {
chart.pluginInitialized = true;
},
afterDraw: function (chart, options) {
if (chart.pluginInitialized) {
var centerIndex = Math.floor(chart.data.labels.length/2);
for(var i=0; i<chart.data.datasets.length; i++) {
chart.getDatasetMeta(i).data.forEach(function(ele, idx) {
var opacity = ' 0.3)';
if (idx == centerIndex) {
opacity = ' 1)';
}
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var rgb = ele._model.backgroundColor;
var match = null;
if (match = rgb.match(/^#([a-fA-F0-9]{6})$/i)) {
rgb = 'rgb(';
match = match[1];
for (var j = 0; j < 3; j++) {
rgb += parseInt(match.slice(j * 2, j * 2 + 2), 16) + ',';
}
rgb += opacity;
}
ele.custom.backgroundColor = rgb;
}
});
}
chart.pluginInitialized = false;
chart.update(true);
}
}
});
var ctx = document.getElementById('ctx').getContext('2d');
var data = {
"labels":["2011","2012","2013","2014","2015"],
"datasets":[
{
"label":"Total Fishermen",
"backgroundColor":"#518936",
"data":[991,1020,731,850,851]
},
{
"label":"Total Processing Employees",
"backgroundColor":"#82c6d4",
"data":[0,0,130,0,0]
},
{
"label":"Total Aquaculture Employees",
"backgroundColor":"#c0136b",
"data":[0,134,130,119,0]
}
]
};
var myChart = new Chart(ctx, {
type: 'bar',
data: data,
options: {
onClick: function (e) {
// remove old background opacity....
for(i=0; i<this.data.datasets.length; i++) {
this.getDatasetMeta(i).data.forEach(function(ele, idx) {
var rgx = /(rgba*\(\d{1,3}), *(\d{1,3}), *(\d{1,3}), *[0-9.]+(\))/;
ele._model.backgroundColor = ele._model.backgroundColor.replace(rgx, ", , ");
if (ele.custom != undefined)
delete ele.custom.backgroundColor;
});
}
// set backgrounf opacity....
this.active.forEach(function(ele, idx) {
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var color = ele._model.backgroundColor.replace(')', ', 0.5)');
ele.custom.backgroundColor = color;
} else {
delete ele.custom.backgroundColor;
}
});
myChart.update(true);
}
}
});
.graph {
height: 500px;
width: 500px;
text-align: center;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<div class="graph">
<canvas id="ctx"></canvas>
</div>
我正在尝试更改 ChartJS 中最后单击的栏的不透明度,然后在下一次单击另一个栏时将其设置为 'unhighlighted'。基本上是悬停的默认行为。请注意,这是一个堆叠条形图,我希望整个条形柱的不透明度都发生变化,而不是每个单独的部分。
我已经知道可以在单击时将背景颜色(不确定如何更改不透明度)更改为黑色,但单击下一个项目时它不会取消设置。因此,一旦所有内容都被点击,整个图表最终会变成黑色。
这是我目前使用的onclick代码:
var myChart = new Chart(ctx, {
type: 'bar',
data: data,
options: {
onClick: function(e){
myChart.update();
var element = this.getElementAtEvent(event)[0];
element.custom = element.custom || {};
element.custom.backgroundColor = '#000';
},
}
});
堆叠数据:
var data = {
"labels":["2011","2012","2013","2014","2015"],
"datasets":[
{
"label":"Total Fishermen",
"backgroundColor":"#518936",
"data":[991,1020,731,850,851]
},
{
"label":"Total Processing Employees",
"backgroundColor":"#82c6d4",
"data":[0,0,130,0,0]
},
{
"label":"Total Aquaculture Employees",
"backgroundColor":"#c0136b",
"data":[0,134,130,119,0]
}
]
};
任何帮助将不胜感激!
... but it does not unset when the next item is clicked.
您可以使用 active 属性 来获取活动的组元素并使用当前的 backgroundColor 添加 50% 的 transparency:
this.active.forEach(function(ele, idx) {
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var color = ele._model.backgroundColor.replace(')', ', 0.5)');
ele.custom.backgroundColor = color;
} else {
delete ele.custom.backgroundColor;
}
});
为了重置最后单击的元素,您可以在循环处理所有元素的 onClick 处理程序中执行此操作:
for(i=0; i<this.data.datasets.length; i++) {
this.getDatasetMeta(i).data.forEach(function(ele, idx) {
if (ele.custom != undefined)
delete ele.custom.backgroundColor;
});
}
Chart.pluginService.register({
afterInit: function (chart, options) {
chart.pluginInitialized = true;
},
afterDraw: function (chart, options) {
if (chart.pluginInitialized) {
var centerIndex = Math.floor(chart.data.labels.length/2);
for(var i=0; i<chart.data.datasets.length; i++) {
chart.getDatasetMeta(i).data.forEach(function(ele, idx) {
var opacity = ' 0.3)';
if (idx == centerIndex) {
opacity = ' 1)';
}
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var rgb = ele._model.backgroundColor;
var match = null;
if (match = rgb.match(/^#([a-fA-F0-9]{6})$/i)) {
rgb = 'rgb(';
match = match[1];
for (var j = 0; j < 3; j++) {
rgb += parseInt(match.slice(j * 2, j * 2 + 2), 16) + ',';
}
rgb += opacity;
}
ele.custom.backgroundColor = rgb;
}
});
}
chart.pluginInitialized = false;
chart.update(true);
}
}
});
var ctx = document.getElementById('ctx').getContext('2d');
var data = {
"labels":["2011","2012","2013","2014","2015"],
"datasets":[
{
"label":"Total Fishermen",
"backgroundColor":"#518936",
"data":[991,1020,731,850,851]
},
{
"label":"Total Processing Employees",
"backgroundColor":"#82c6d4",
"data":[0,0,130,0,0]
},
{
"label":"Total Aquaculture Employees",
"backgroundColor":"#c0136b",
"data":[0,134,130,119,0]
}
]
};
var myChart = new Chart(ctx, {
type: 'bar',
data: data,
options: {
onClick: function (e) {
// remove old background opacity....
for(i=0; i<this.data.datasets.length; i++) {
this.getDatasetMeta(i).data.forEach(function(ele, idx) {
var rgx = /(rgba*\(\d{1,3}), *(\d{1,3}), *(\d{1,3}), *[0-9.]+(\))/;
ele._model.backgroundColor = ele._model.backgroundColor.replace(rgx, ", , ");
if (ele.custom != undefined)
delete ele.custom.backgroundColor;
});
}
// set backgrounf opacity....
this.active.forEach(function(ele, idx) {
ele.custom = ele.custom || {};
if (ele.custom.backgroundColor == undefined) {
var color = ele._model.backgroundColor.replace(')', ', 0.5)');
ele.custom.backgroundColor = color;
} else {
delete ele.custom.backgroundColor;
}
});
myChart.update(true);
}
}
});
.graph {
height: 500px;
width: 500px;
text-align: center;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<div class="graph">
<canvas id="ctx"></canvas>
</div>