Chartjs 2.7.2,数据集重叠的堆叠折线图背景颜色

hpxqektj  于 2024-01-07  发布在  Chart.js
关注(0)|答案(1)|浏览(210)

我的堆叠折线图中的数据集的背景颜色相互混合,就像下面一样。


的数据
下面是我的代码:

  1. var chart = new Chart($('#chart-area'), {
  2. type: "line",
  3. data: {
  4. labels: [],
  5. datasets: [],
  6. },
  7. options: {
  8. responsive: true,
  9. maintainAspectRatio: false,
  10. hover: {
  11. mode: 'index',
  12. intersect: false
  13. },
  14. scales: {
  15. yAxes: [{
  16. stacked: true
  17. }]
  18. }
  19. },
  20. });

字符串
我创建了dinamic数据集:

  1. chart.data.datasets.push({
  2. label: LABELS,
  3. borderColor: COLOR1,
  4. backgroundColor: COLOR2,
  5. data: []
  6. });


我的颜色示例:

  1. COLOR1 -> "#000c89",
  2. COLOR2 -> 'rgba(0, 12, 137, 0.4)'


任何想法如何使颜色看起来像他们的正常?他们得到混合(我认为这是因为透明度),我可以使他们没有透明度,但图表变得丑陋。

mjqavswn

mjqavswn1#

实际上,颜色混合是因为透明度。我不认为这是可以避免的,因为rgba中存在透明度通道的唯一原因是允许“前景”和“背景”颜色的混合。
实际上,rgba不应该提供比rgb更多的颜色。
通过在chart.js背景中使用rgba获得的漂亮颜色是将该颜色的rgb部分作为“前景”与通常为白色(rgb(255, 255, 255))的图表背景相结合的结果。

  1. rMix = Math.round(r * a + 255 * (1 - a))
  2. gMix = Math.round(g * a + 255 * (1 - a))
  3. bMix = Math.round(b * a + 255 * (1 - a))

字符串
下面是一个代码片段,

  1. function runColors() {
  2. const ctxRgba = document.querySelector('#cvs_rgba').getContext('2d'),
  3. ctxRgb = document.querySelector('#cvs_rgb').getContext('2d'),
  4. textRgba = document.querySelector('#rgba'),
  5. textRgb = document.querySelector('#rgb');
  6. textRgba.innerText = '';
  7. textRgb.innerText = '';
  8. ctxRgba.fillStyle = 'rgb(255,255,255)';
  9. ctxRgba.fillRect(0, 0, 300, 150);
  10. ctxRgb.fillStyle = 'rgb(255,255,255)';
  11. ctxRgb.fillRect(0, 0, 300, 150);
  12. const r = parseInt(document.querySelector('#r').value, 10),
  13. g = parseInt(document.querySelector('#g').value, 10),
  14. b = parseInt(document.querySelector('#b').value, 10),
  15. a = parseFloat(document.querySelector('#a').value);
  16. if (r < 0 || r > 255 || b < 0 || b > 255 || g < 0 || g > 255 || a < 0 || a > 1) {
  17. document.querySelector('#error').innerText = 'Invalid data';
  18. return;
  19. }
  20. document.querySelector('#error').innerText = '';
  21. const sRGBA = `rgba(${r},${g},${b},${a.toFixed(4).replace(/0+$/, '')})`;
  22. textRgba.innerText = sRGBA;
  23. const r1 = Math.round(r * a + 255 * (1 - a)),
  24. b1 = Math.round(b * a + 255 * (1 - a)),
  25. g1 = Math.round(g * a + 255 * (1 - a));
  26. const sRGB = `rgb(${r1},${g1},${b1})`;
  27. textRgb.innerText = sRGB;
  28. ctxRgba.fillStyle = sRGBA;
  29. ctxRgba.fillRect(0, 0, 300, 150);
  30. ctxRgb.fillStyle = sRGB;
  31. ctxRgb.fillRect(0, 0, 300, 150);
  32. }
  33. runColors();
  1. <body>
  2. <h3>
  3. <code>rgb</code> result of mixing an <code>rgba</code> color with a white background
  4. </h3>
  5. R:<input type="text" size="3" value="0" id="r" onchange="runColors()"> G:
  6. <input type="text" size="3" value="12" id="g" onchange="runColors()"> B:
  7. <input type="text" size="3" value="137" id="b" onchange="runColors()"> A:
  8. <input type="text" size="5" value="0.4" id="a" onchange="runColors()">
  9. <div id="error" style="color:red"></div>
  10. <div style="display: inline-block; border:1px solid black">
  11. <canvas id="cvs_rgba" style="width: 200px; height: 50px;background-color: rgb(255, 255, 255)"></canvas>
  12. <br>
  13. <code id="rgba"></code>
  14. </div>
  15. <div style="display: inline-block; border:1px solid black">
  16. <canvas id="cvs_rgb" style="width: 200px; height: 50px;background-color: rgb(255, 255, 255)"></canvas>
  17. <br>
  18. <code id="rgb"></code>
  19. </div>

的数据
也就是jsFiddle

增编

注意事项:我必须补充一下我在理论上对广色域颜色的了解,因为它与所问的问题间接相关;然而,这只是抽象的信息,因为我从未使用过这些颜色空间,也没有HDR显示器。如果您知道更多,请对此做出贡献(消息/新答案/编辑/否决)。
比rgb(24)更宽的颜色空间是一个很大的主题,但值得一提的是,在2023年底发布时,浏览器已经对它有了很好的支持。你可以从简单但很好的介绍开始,比如this one,或者阅读css 4和githb canvas-color-space pages的规范。
一个简单的测试表明,如果使用backgroundColor: "color(display-p3 0 1 0)",chart.js不会抱怨,但会将该颜色传递给canvas函数。这意味着可以为chart.js编写宽色域就绪代码。然而,在代码中创建canvas上下文的方式似乎表明,目前用户无法设置颜色空间,即使CanvasRenderingContext2d作为第一个参数传递给Chart构造函数,也不会。

展开查看全部

相关问题