Цвет диаграммы Chart.js задает цвет фона

Я работаю с Chart.js и хочу преобразовать линейную диаграмму в PNG. Проблема заключается в том, что изображение всегда загружается с прозрачным фоном, который мне не нужен. Я пробовал много вариантов, ничего действительно не работало.

И предложения?

Ответ 1

Здесь один из способов получить полностью непрозрачную версию вашего ChartJS:

Подождите, пока диаграмма будет полностью анимирована и завершится. Вы можете сделать это, добавив свойство onAnimationComplete в диаграмму.

В функции onAnimationComplete:

  • Создайте временный холст в памяти такого же размера, что и ваша диаграмма.
  • Заполните холст temp с белым цветом
  • drawImage холст ChartJS над белым заполненным холстом temp
  • Создайте изображение из холста temp.

Вот как это можно сделать:

var ctx = document.getElementById("canvas").getContext("2d");
window.myLine = new Chart(ctx).Line(lineChartData, {
  responsive: true,
  onAnimationComplete:function(){
      var tcanvas=document.createElement('canvas');
      var tctx=tcanvas.getContext('2d');
      tcanvas.width=ctx.canvas.width;
      tcanvas.height=ctx.canvas.height;
      tctx.fillStyle='white';
      tctx.fillRect(0,0,tcanvas.width,tcanvas.height);
      tctx.drawImage(canvas,0,0);
      var img=new Image();
      img.onload=function(){
          document.body.appendChild(img);
      }
      img.src=tcanvas.toDataURL();
  }
});

Здесь пример кода и демонстрационный пример:

var randomScalingFactor = function(){ return Math.round(Math.random()*100)};

var randomColorFactor = function(){ return Math.round(Math.random()*255)};

var lineChartData = {
  labels : ["January","February","March","April","May","June","July"],
  datasets : [
    {
      label: "My First dataset",
      fillColor : "rgba(220,220,220,0.2)",
      strokeColor : "rgba(220,220,220,1)",
      pointColor : "rgba(220,220,220,1)",
      pointStrokeColor : "#fff",
      pointHighlightFill : "#fff",
      pointHighlightStroke : "rgba(220,220,220,1)",
      data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
    },
    {
      label: "My Second dataset",
      fillColor : "rgba(151,187,205,0.2)",
      strokeColor : "rgba(151,187,205,1)",
      pointColor : "rgba(151,187,205,1)",
      pointStrokeColor : "#fff",
      pointHighlightFill : "#fff",
      pointHighlightStroke : "rgba(151,187,205,1)",
      data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
    }
  ]

}

var ctx = document.getElementById("canvas").getContext("2d");
window.myLine = new Chart(ctx).Line(lineChartData, {
  responsive: true,
  onAnimationComplete:function(){
    var tcanvas=document.createElement('canvas');
    var tctx=tcanvas.getContext('2d');
    tcanvas.width=ctx.canvas.width;
    tcanvas.height=ctx.canvas.height;
    tctx.fillStyle='white';
    tctx.fillRect(0,0,tcanvas.width,tcanvas.height);
    tctx.drawImage(canvas,0,0);
    var img=new Image();
    img.onload=function(){
      document.body.appendChild(img);
    }
    img.src=tcanvas.toDataURL();
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<h4>ChartJS line chart</h4>
<div style="width:30%">
  <div>
    <canvas id="canvas" height="450" width="600"></canvas>
  </div>
</div>
<h4>Fully opaque chart as image</h4>

Ответ 2

Вот решение, которое отлично работает, также при сохранении в файл изображения (например, png). Я откровенно копирую это из @etimberg в отслеживании проблем с диаграммами.

Chart.plugins.register({
  beforeDraw: function(chartInstance) {
    var ctx = chartInstance.chart.ctx;
    ctx.fillStyle = "white";
    ctx.fillRect(0, 0, chartInstance.chart.width, chartInstance.chart.height);
  }
});

Это должно идти перед вашей диаграммой в источнике.

Ответ 3

Почему вы не пытаетесь использовать css? Элемент canvas как обычный элемент HTML правильно? Таким образом, вы можете установить цвет фона или установить фон на изображение с помощью css.

$('#myChart').css('background-color', 'rgba(0, 0, 0, 0)'); // this worked for me but I'm guessing you can set a background image using css like you normally do.

Ответ 4

Вы можете решить эту проблему просто, если вы хотите изменить код в chart.js.

Там функция в chart.js называется clear. Вы можете найти четкую функцию, выполнив поиск clearRect. Функция clear вызывается каждый раз, когда chart.js перерисовывает диаграмму, так что там, где мы будем устанавливать фон. Прямо под строкой с clearRect добавьте следующие строки.

...
chart.ctx.clearRect(0,0,chart.width,chart.height);

// Add these 3 lines
chart.ctx.rect(0, 0, chart.width, chart.height);
chart.ctx.fillStyle="#fff"; // Put your desired background color here
chart.ctx.fill();
...