我想通过chart.js条形图创建与照片中的相同
我做了几乎所有的事情,但我有问题在图表中用background color
长度条做一些空格。
这就是我所做的:
提前感谢您的帮助,
鲇鱼
答案 0 :(得分:2)
目前ChartJS中有没有原生功能。
实现此目的的唯一方法是创建自己的图表插件并绘制白色背景。
<强>ᴘʟᴜɢɪɴ强>
Chart.plugins.register({
afterDatasetsDraw: function(chartInstance) {
var ctx = chartInstance.chart.ctx,
width = chartInstance.chartArea.right;
chartInstance.data.datasets.forEach(function(dataset, datasetIndex) {
var datasetMeta = chartInstance.getDatasetMeta(datasetIndex);
datasetMeta.data.forEach(function(segment, segmentIndex) {
var height = segment._model.height,
posX = segment.tooltipPosition().x,
posY = segment.tooltipPosition().y - (height / 2);
// draw white background
ctx.save();
ctx.fillStyle = 'white';
ctx.fillRect(posX, posY, width - posX, height);
ctx.restore();
});
});
}
});
ᴅᴇᴍᴏ⧩
Chart.plugins.register({
beforeDraw: function(chartInstance, easing) {
var ctx = chartInstance.chart.ctx;
ctx.fillStyle = 'rgb(53, 53, 53)';
var chartArea = chartInstance.chartArea;
ctx.fillRect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
}
});
Chart.plugins.register({
afterDatasetsDraw: function(chartInstance) {
var ctx = chartInstance.chart.ctx,
width = chartInstance.chartArea.right;
chartInstance.data.datasets.forEach(function(dataset, datasetIndex) {
var datasetMeta = chartInstance.getDatasetMeta(datasetIndex);
datasetMeta.data.forEach(function(segment, segmentIndex) {
var height = segment._model.height,
posX = segment.tooltipPosition().x,
posY = segment.tooltipPosition().y - (height / 2);
// draw white background
ctx.save();
ctx.fillStyle = 'white';
ctx.fillRect(posX, posY, width - posX, height);
ctx.restore();
});
});
}
});
var ctx = document.getElementById('myChart').getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 200;
var chart = new Chart(ctx, {
type: 'horizontalBar',
data: {
labels: ["C++ development", ".Net", "HTML5", "jQuery", "Angular"],
datasets: [{
backgroundColor: 'rgb(54, 195, 110)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderWidth: 0,
data: [95, 75, 80, 55, 85]
}]
},
options: {
responsive: false,
legend: {
display: false,
},
title: {
display: false,
},
scales: {
xAxes: [{
ticks: {
beginAtZero: true
},
display: false
}],
yAxes: [{
display: false
}]
},
tooltips: {
titleFontFamily: 'Raleway, sans-serif',
titleFontSize: 13,
bodyFontFamily: 'Raleway, sans-serif',
callbacks: {
label: function(tooltipItem, data) {
var allData = data.datasets[tooltipItem.datasetIndex].data;
var tooltipData = allData[tooltipItem.index];
var total = 0;
for (var i in allData) {
total += allData[i];
}
return tooltipData + '%';
}
}
}
}
});
canvas { background: rgb(53, 53, 53); padding: 20px }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js">
</script>
<div id="chart_JS">
<canvas id="myChart"></canvas>
</div>
答案 1 :(得分:2)
您可以复制第一个数据集,只能放置100(%)和此设置的白色背景。
和!!! yAxes: [{ stacked: true }],
https://jsfiddle.net/qrwvvtxs/3/
Chart.plugins.register({
beforeDraw: function(chartInstance, easing) {
var ctx = chartInstance.chart.ctx;
ctx.fillStyle = 'rgb(53, 53, 53)';
var chartArea = chartInstance.chartArea;
ctx.fillRect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
}
});
var ctx = document.getElementById('myChart').getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 200;
var chart = new Chart(ctx, {
type: 'horizontalBar',
data: {
labels: ["C++ development", ".Net", "HTML5", "jQuery", "Angular"],
datasets: [{
backgroundColor: 'rgb(54, 195, 110)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderWidth: 0,
data: [95, 75, 80, 55, 85]
},{
backgroundColor: 'rgb(255, 255, 255)',
borderColor: 'rgba(255, 255, 255, 0.5)',
borderWidth: 0,
data: [100, 100, 100, 100, 100]
}],
},
options: {
responsive: false,
legend: {
display: false,
},
title: {
display: false,
},
scales: {
xAxes: [{
ticks: {
beginAtZero: true
},
display: false
}],
yAxes: [{
stacked: true,
display: false
}],
},
tooltips: {
titleFontFamily: 'Raleway, sans-serif',
titleFontSize: 13,
bodyFontFamily: 'Raleway, sans-serif',
callbacks: {
label: function(tooltipItem, data) {
var allData = data.datasets[tooltipItem.datasetIndex].data;
var tooltipData = allData[tooltipItem.index];
var total = 0;
for (var i in allData) {
total += allData[i];
}
return tooltipData + '%';
}
}
}
}
});
body {
background: #aaa;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.bundle.min.js"></script>
<div id="chart_JS">
<canvas id="myChart"></canvas>
</div>