我的堆叠折线图中的数据集的背景 colored颜色 相互混合,如下所示.

enter image description here

这是我的代码:

var chart = new Chart($('#chart-area'), {
    type: "line",
    data: {
        labels: [],
        datasets: [],
    },
    options: {
        responsive: true,
        maintainAspectRatio: false,
        hover: {
            mode: 'index',
            intersect: false
        },
        scales: {
            yAxes: [{
                stacked: true
            }]
        }
    },
});

我创建了动态的数据集:

chart.data.datasets.push({
     label: LABELS,
     borderColor: COLOR1,
     backgroundColor: COLOR2,
     data: []
});

我的 colored颜色 示例:

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

你知道怎么让 colored颜色 看起来像正常 colored颜色 吗?它们混合在一起(我认为这是因为透明度),我可以在没有透明度的情况下制作它们,但图表变得很难看.

推荐答案

事实上, colored颜色 混合是因为它的透明度.我认为避免这种效果是不可能的,因为在rgba中有一个透明通道的唯一原因是允许"前景"和"背景" colored颜色 的混合.

事实上,rgba不应该提供比rgb更多的 colored颜色 .

在chart.js背景中使用rgba可以获得漂亮的 colored颜色 ,这是将该 colored颜色 的rgb部分作为"前景"与通常为白色(rgb(255, 255, 255))的图表背景相结合的结果.所得到的RGB混合的分量可以用以下公式计算

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

下面是执行该计算代码片段

function runColors() {
  const ctxRgba = document.querySelector('#cvs_rgba').getContext('2d'),
    ctxRgb = document.querySelector('#cvs_rgb').getContext('2d'),
    textRgba = document.querySelector('#rgba'),
    textRgb = document.querySelector('#rgb');

  textRgba.innerText = '';
  textRgb.innerText = '';
  ctxRgba.fillStyle = 'rgb(255,255,255)';
  ctxRgba.fillRect(0, 0, 300, 150);
  ctxRgb.fillStyle = 'rgb(255,255,255)';
  ctxRgb.fillRect(0, 0, 300, 150);
  const r = parseInt(document.querySelector('#r').value, 10),
    g = parseInt(document.querySelector('#g').value, 10),
    b = parseInt(document.querySelector('#b').value, 10),
    a = parseFloat(document.querySelector('#a').value);
  if (r < 0 || r > 255 || b < 0 || b > 255 || g < 0 || g > 255 || a < 0 || a > 1) {
    document.querySelector('#error').innerText = 'Invalid data';
    return;
  }
  document.querySelector('#error').innerText = '';
  const sRGBA = `rgba(${r},${g},${b},${a.toFixed(4).replace(/0+$/, '')})`;
  textRgba.innerText = sRGBA;
  const r1 = Math.round(r * a + 255 * (1 - a)),
    b1 = Math.round(b * a + 255 * (1 - a)),
    g1 = Math.round(g * a + 255 * (1 - a));
  const sRGB = `rgb(${r1},${g1},${b1})`;
  textRgb.innerText = sRGB;

  ctxRgba.fillStyle = sRGBA;
  ctxRgba.fillRect(0, 0, 300, 150);

  ctxRgb.fillStyle = sRGB;
  ctxRgb.fillRect(0, 0, 300, 150);
}

runColors();
<body>
  <h3>
    <code>rgb</code> result of mixing an <code>rgba</code> color with a white background
  </h3>
  R:<input type="text" size="3" value="0" id="r" onchange="runColors()"> G:
  <input type="text" size="3" value="12" id="g" onchange="runColors()"> B:
  <input type="text" size="3" value="137" id="b" onchange="runColors()"> A:
  <input type="text" size="5" value="0.4" id="a" onchange="runColors()">
  <div id="error" style="color:red"></div>
  <div style="display: inline-block; border:1px solid black">
    <canvas id="cvs_rgba" style="width: 200px; height: 50px;background-color: rgb(255, 255, 255)"></canvas>
    <br>
    <code id="rgba"></code>
  </div>
  <div style="display: inline-block; border:1px solid black">
    <canvas id="cvs_rgb" style="width: 200px; height: 50px;background-color: rgb(255, 255, 255)"></canvas>
    <br>
    <code id="rgb"></code>
  </div>

也是jsFiddle分.


Addendum

注:我必须补充我对广域色彩主题的理论知识,因为它与所提出的问题间接相关;然而,这只是抽象的信息,因为我从未使用过这些色彩空间,也没有HDR显示器.如果您知道更多信息,请为此(消息/新答案/编辑/否决)做出贡献.

令人担忧的是,比rgb(24)更宽的 colored颜色 空间,这是一个很大的话题,但值得一提的是,(在发布时,2023年底)浏览器已经对它提供了很好的支持.你可以从简单但很好的介绍开始,比如this one,或者阅读css4githb canvas-color-space pages中的规格.

一个简单的测试显示,如果使用backgroundColor: "color(display-p3 0 1 0)",但将该 colored颜色 传递给画布函数,则chart.js不会出现错误.这意味着可以为chart.js编写宽域就绪代码.然而,在代码中创建画布上下文的方式似乎表明,用户目前无法设置 colored颜色 空间,即使将CanvasRenderingContext2d作为第一个参数传递给Chart构造函数也是如此.

Javascript相关问答推荐

仅圆角的甜甜圈图表

类型脚本中只有字符串或数字键而不是符号键的对象

从WooCommerce Checkout Country字段重新排序国家,保持国家同步

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

如何在Vue 3中创建自定义 Select 组件,并将选项作为HTML而不是props 传递?

Prisma具有至少一个值的多对多关系

覆盖TypeScrip中的Lit-Element子类的属性类型

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

使用getBorbingClientRect()更改绝对元素位置

当用户点击保存按钮时,如何实现任务的更改?

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

如何通过Axios在GraphQL查询中发送数组

我不知道如何纠正这一点.

MongoDB通过数字或字符串过滤列表

ComponentWillReceiveProps仍在React 18.2.0中工作

使用props 将VUE 3组件导入JS文件

当达到高度限制时,如何裁剪图像?使用html和css

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但GET:Object.在Reaction项目中