简体   繁体   English

如何在图表(chartJS)中添加长条的背景色?

[英]How can I add background color of length bars in chart (chartJS)?

I want to create by chart.js bar chart as the same as is in the photo 我想通过chart.js创建条形图,就像在照片中一样

图片

I did almost everything but I have problem to do some white spaces as background color of length bars in the chart. 我几乎做了所有事情,但是我在将一些空白作为图表中长条的background color时遇到问题。

This is what I have done: 这是我所做的:

CodePen 密码笔

Thank you for your help in advance, 提前谢谢你的帮助,

Megi 梅吉

There is no native functionality for this in ChartJS at the moment. 目前,ChartJS中没有针对此的本机功能。

Only way to achieve this is to create your own chart plugin and draw the white background. 实现此目的的唯一方法是创建自己的图表插件并绘制白色背景。

ᴘʟᴜɢɪɴ ᴘʟᴜɢɪɴ

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> 

You can duplicate the first dataset, only to put everywhere 100 (%) and a white background for this set. 您可以复制第一个数据集,但只能将此位置放100(%)和白色背景。

and !!! 和! for yAxes: [{ stacked: true }], 对于yAxes: [{ stacked: true }],

https://jsfiddle.net/qrwvvtxs/3/ 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> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM