Chart.js:创建带有叠加和偏移条形图的条形图
Chart.js: Creating a Barchart with overlaying and offset Bars
我是 Chart.js 的新手,我尝试创建一个图表,其中包含两个数据集和重叠条(未堆叠),并有轻微偏移。
供参考:大致如下:
我创建了一个图表,其中两个条形图彼此完全重叠,但无法创建如图所示具有偏移量的图表。
我当前的代码:
var ctx = document.getElementById('Chart');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Orange', 'Green'],
datasets: [{
label: 'Vote Share Now',
data: [25.5,22.7,8.6,5.5],
backgroundColor: [
'rgba(250,0,0,0.7)',
'rgba(0,17,255, 0.7)',
'rgba(255,155,0, 0.7)',
'rgba(0,255,9,0.7)'
],
xAxisID: "Now",
},{
label: 'Vote Share Then',
data: [22.5,29.7,10.3,5.3],
backgroundColor: [
'rgba(250,0,0,0.2)',
'rgba(0,17,255,0.2)',
'rgba(255,115,0,0.2)',
'rgba(0, 255,9,0.2)'
],
xAxisID: "Then",
}]
},
options:{
responsive: false,
legend:{
onClick: null
},
scales: {
xAxes: [{
stacked: true,
id: "Now",
barThickness: 70,
},{
display: false,
stacked: true,
id: "Then",
barThickness: 40,
type: 'category',
categoryPercentage: 0.8,
barPercentage: 0.9,
gridLines: {
offsetGridLines: true
},
offset: true
}],
yAxes: [{
stacked: false,
ticks: {
min: 0,
max: 50,
beginAtZero: true,
callback: function(value, index, values){
return value + '%';
}
}
}]
}
}
});
Plugin Core API 提供了一系列可用于执行自定义代码的挂钩。您可以使用 afterUpdate
挂钩从第二个数据集中移动(偏移)条形的 x 位置。
请查看下面您修改后的代码。
const offset = 22;
var myChart = new Chart(document.getElementById('Chart'), {
type: 'bar',
plugins: [{
afterUpdate: function(chart) {
var dataset = chart.config.data.datasets[1];
for (var i = 0; i < dataset._meta[0].data.length; i++) {
var model = dataset._meta[0].data[i]._model;
model.x += offset;
model.controlPointNextX += offset;
model.controlPointPreviousX += offset;
}
}
}],
data: {
labels: ['Red', 'Blue', 'Orange', 'Green'],
datasets: [{
label: 'Vote Share Now',
data: [25.5, 22.7, 8.6, 5.5],
backgroundColor: [
'rgba(250,0,0,0.7)',
'rgba(0,17,255, 0.7)',
'rgba(255,155,0, 0.7)',
'rgba(0,255,9,0.7)'
],
categoryPercentage: 0.8,
barPercentage: 0.9,
xAxisID: "Now",
}, {
label: 'Vote Share Then',
data: [22.5, 29.7, 10.3, 5.3],
backgroundColor: [
'rgba(250,0,0,0.2)',
'rgba(0,17,255,0.2)',
'rgba(255,115,0,0.2)',
'rgba(0, 255,9,0.2)'
],
categoryPercentage: 0.6,
barPercentage: 0.6,
xAxisID: "Then",
}]
},
options: {
responsive: false,
legend: {
onClick: null
},
scales: {
xAxes: [{
id: "Now",
gridLines: {
display: false
}
},
{
id: "Then",
offset: true,
display: false
}
],
yAxes: [{
ticks: {
min: 0,
max: 50,
stepSize: 10,
callback: function(value, index, values) {
return value + '%';
}
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="Chart" height="200"></canvas>
我是 Chart.js 的新手,我尝试创建一个图表,其中包含两个数据集和重叠条(未堆叠),并有轻微偏移。
供参考:大致如下:
我创建了一个图表,其中两个条形图彼此完全重叠,但无法创建如图所示具有偏移量的图表。
我当前的代码:
var ctx = document.getElementById('Chart');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Red', 'Blue', 'Orange', 'Green'],
datasets: [{
label: 'Vote Share Now',
data: [25.5,22.7,8.6,5.5],
backgroundColor: [
'rgba(250,0,0,0.7)',
'rgba(0,17,255, 0.7)',
'rgba(255,155,0, 0.7)',
'rgba(0,255,9,0.7)'
],
xAxisID: "Now",
},{
label: 'Vote Share Then',
data: [22.5,29.7,10.3,5.3],
backgroundColor: [
'rgba(250,0,0,0.2)',
'rgba(0,17,255,0.2)',
'rgba(255,115,0,0.2)',
'rgba(0, 255,9,0.2)'
],
xAxisID: "Then",
}]
},
options:{
responsive: false,
legend:{
onClick: null
},
scales: {
xAxes: [{
stacked: true,
id: "Now",
barThickness: 70,
},{
display: false,
stacked: true,
id: "Then",
barThickness: 40,
type: 'category',
categoryPercentage: 0.8,
barPercentage: 0.9,
gridLines: {
offsetGridLines: true
},
offset: true
}],
yAxes: [{
stacked: false,
ticks: {
min: 0,
max: 50,
beginAtZero: true,
callback: function(value, index, values){
return value + '%';
}
}
}]
}
}
});
Plugin Core API 提供了一系列可用于执行自定义代码的挂钩。您可以使用 afterUpdate
挂钩从第二个数据集中移动(偏移)条形的 x 位置。
请查看下面您修改后的代码。
const offset = 22;
var myChart = new Chart(document.getElementById('Chart'), {
type: 'bar',
plugins: [{
afterUpdate: function(chart) {
var dataset = chart.config.data.datasets[1];
for (var i = 0; i < dataset._meta[0].data.length; i++) {
var model = dataset._meta[0].data[i]._model;
model.x += offset;
model.controlPointNextX += offset;
model.controlPointPreviousX += offset;
}
}
}],
data: {
labels: ['Red', 'Blue', 'Orange', 'Green'],
datasets: [{
label: 'Vote Share Now',
data: [25.5, 22.7, 8.6, 5.5],
backgroundColor: [
'rgba(250,0,0,0.7)',
'rgba(0,17,255, 0.7)',
'rgba(255,155,0, 0.7)',
'rgba(0,255,9,0.7)'
],
categoryPercentage: 0.8,
barPercentage: 0.9,
xAxisID: "Now",
}, {
label: 'Vote Share Then',
data: [22.5, 29.7, 10.3, 5.3],
backgroundColor: [
'rgba(250,0,0,0.2)',
'rgba(0,17,255,0.2)',
'rgba(255,115,0,0.2)',
'rgba(0, 255,9,0.2)'
],
categoryPercentage: 0.6,
barPercentage: 0.6,
xAxisID: "Then",
}]
},
options: {
responsive: false,
legend: {
onClick: null
},
scales: {
xAxes: [{
id: "Now",
gridLines: {
display: false
}
},
{
id: "Then",
offset: true,
display: false
}
],
yAxes: [{
ticks: {
min: 0,
max: 50,
stepSize: 10,
callback: function(value, index, values) {
return value + '%';
}
}
}]
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="Chart" height="200"></canvas>