Chart.js 中背景的多范围突出显示

2023-12-23

由此question https://stackoverflow.com/questions/36685745/acceptable-range-highlighting-of-background-in-chart-js-2-0我希望变成多范围亮点

但有 1 个烦人的错误我没有成功解决

  • 背景是叠加的,如果取消选中顶部的数据集,背景 alpha 会发生变化

这是我到目前为止的工作:https://jsfiddle.net/742zut83/588/ https://jsfiddle.net/742zut83/588/

为什么要为每个数据集执行自定义绘制函数?亮点完成后originalLineDraw被返回

draw : function() {
  var chart = this.chart;
  // Get the object that determines the region to highlight.
  var yHighlightRanges = chart.config.data.yHighlightRanges;

  let ctx = chart.chart.ctx;

  yHighlightRanges.forEach(function(Range) {

    var yRangeBegin = Range.begin;
    var yRangeEnd = Range.end;

    var xaxis = chart.scales['x-axis-0'];
    var yaxis = chart.scales['y-axis-0'];

    var yRangeBeginPixel = yaxis.getPixelForValue(yRangeBegin);
    var yRangeEndPixel = yaxis.getPixelForValue(yRangeEnd);

    ctx.save();

    // The fill style of the rectangle we are about to fill.
    ctx.fillStyle = Range.rgb;
    // Fill the rectangle that represents the highlight region. The parameters are the closest-to-starting-point pixel's x-coordinate,
    // the closest-to-starting-point pixel's y-coordinate, the width of the rectangle in pixels, and the height of the rectangle in pixels, respectively.
    ctx.fillRect(xaxis.left, Math.min(yRangeBeginPixel, yRangeEndPixel), xaxis.right - xaxis.left, Math.max(yRangeBeginPixel, yRangeEndPixel) - Math.min(yRangeBeginPixel, yRangeEndPixel));

    ctx.restore();
  });

  // Apply the original draw function for the line chart.
  originalLineDraw.apply(this, arguments);
}
var ctx = document.getElementById("myChart");

// The original draw function for the line chart. This will be applied after we have drawn our highlight range (as a rectangle behind the line chart).
var originalLineDraw = Chart.controllers.line.prototype.draw;
// Extend the line chart, in order to override the draw function.
Chart.helpers.extend(Chart.controllers.line.prototype, {
  draw : function() {
    var chart = this.chart;
    // Get the object that determines the region to highlight.
    var yHighlightRanges = chart.config.data.yHighlightRanges;

    let ctx = chart.chart.ctx;
    
    yHighlightRanges.forEach(function(Range) {
    
      var yRangeBegin = Range.begin;
      var yRangeEnd = Range.end;

      var xaxis = chart.scales['x-axis-0'];
      var yaxis = chart.scales['y-axis-0'];

      var yRangeBeginPixel = yaxis.getPixelForValue(yRangeBegin);
      var yRangeEndPixel = yaxis.getPixelForValue(yRangeEnd);

      ctx.save();

      // The fill style of the rectangle we are about to fill.
      ctx.fillStyle = Range.rgb;
      // Fill the rectangle that represents the highlight region. The parameters are the closest-to-starting-point pixel's x-coordinate,
      // the closest-to-starting-point pixel's y-coordinate, the width of the rectangle in pixels, and the height of the rectangle in pixels, respectively.
      ctx.fillRect(xaxis.left, Math.min(yRangeBeginPixel, yRangeEndPixel), xaxis.right - xaxis.left, Math.max(yRangeBeginPixel, yRangeEndPixel) - Math.min(yRangeBeginPixel, yRangeEndPixel));

      ctx.restore();
    });

    // Apply the original draw function for the line chart.
    originalLineDraw.apply(this, arguments);
  }
});

var myChart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [
        {
        label: 'Season 1',
        data: [12, 17, 3, 5, 9, 3],
        fill: false,
        borderColor: 'rgba(0, 200, 0, 1)'
        },
      {
        label: 'Season 2',
        data: [5, 14, 3, 15, 9, 13],
        fill: false,
        borderColor: 'rgba(200, 0, 0, 1)'
        }
    ],
    // This, if it exists at all, defines the highlight region.
    yHighlightRanges : [
        {
        begin: 0,
        end: 6,
        rgb: 'rgba(100, 100, 100, 0.2)'
      },
      {
        begin: 6,
        end: 12,
        rgb: 'rgba(200, 100, 200, 0.2)'
      },
      {
        begin: 12,
        end: 18,
        rgb: 'rgba(0, 100, 200, 0.2)'
      }
    ]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero:true
        }
      }]
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<canvas id="myChart" width="400" height="400"></canvas>

为什么不简单地使用注释插件 https://github.com/chartjs/chartjs-plugin-annotation?

这是带有注释插件的示例,使用框注释 https://github.com/chartjs/chartjs-plugin-annotation#box-annotations:

var ctx = document.getElementById("myChart");

var myChart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [
    	{
        label: 'Season 1',
        data: [12, 17, 3, 5, 9, 3],
        fill: false,
        borderColor: 'rgba(0, 200, 0, 1)'
    	},
      {
        label: 'Season 2',
        data: [5, 14, 3, 15, 9, 13],
        fill: false,
        borderColor: 'rgba(200, 0, 0, 1)'
    	}
    ]
  },
  options: {
    scales: {
      yAxes: [{
      	id: 'y-axis-1',
        ticks: {
          beginAtZero:true
        }
      }]
    },
    annotation: {
      drawTime: "afterDraw",
      annotations: [{
      	id: 'box1',
        type: 'box',
        yScaleID: 'y-axis-1',
        yMin: 0,
        yMax: 6,
        backgroundColor: 'rgba(100, 100, 100, 0.2)',
        borderColor: 'rgba(100, 100, 100, 0.2)',
      },{
      	id: 'box2',
        type: 'box',
        yScaleID: 'y-axis-1',
        yMin: 6,
        yMax: 12,
        backgroundColor: 'rgba(200, 100, 200, 0.2)',
        borderColor: 'rgba(200, 100, 200, 0.2)',
      },{
      	id: 'box3',
        type: 'box',
        yScaleID: 'y-axis-1',
        yMin: 12,
        yMax: 18,
        backgroundColor: 'rgba(0, 100, 200, 0.2)',
        borderColor: 'rgba(0, 100, 200, 0.2)',
      }]
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-plugin-annotation/0.5.7/chartjs-plugin-annotation.min.js"></script>

<canvas id="myChart" width="400" height="400"></canvas>

这是你的小提琴更新:https://jsfiddle.net/beaver71/50L21shp/ https://jsfiddle.net/beaver71/50L21shp/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chart.js 中背景的多范围突出显示 的相关文章

  • 在 for 循环内顺序执行 Promise

    我正在努力将两个承诺链接到一个循环中 以便第二个承诺在第一个承诺得到解决之前不会启动 我看到了一个减少的例子 还无法让它工作 如果我这样做 就像我现在所做的那样 代码会并行执行 就像这样 所有异步请求都会被触发 当然结果会很混乱 请看一下
  • 查看 chrome 开发者工具中的更改差异

    devtools 可以显示原始文件和当前修改之间的差异吗 或者对于 CSS 来说是修改后的选择器及其新值的列表 我知道 本地修改 每次更改的历史 但不是原始的 当前 映射到工作区 将修改后的文件保存到其源中 源地图 请参阅预处理源 SCSS
  • JavaScript 文件中的快速低冲突非加密哈希

    我正在寻找一种用 JavaScript 实现的低冲突的快速哈希 它不需要是加密哈希 我基本上使用它作为查看给定文件是否已上传 或部分上传 到用户帐户的方式 以节省他们在大型 视频 文件上上传的时间 我正在使用新的 HTML5 文件 API
  • 如何在 .tsx 打字稿中包含 .css 文件?

    如何在 tsx 中包含 css 文件以及如何使用它 即我如何渲染静态文件 import as React from react import Header from header import home css export class H
  • 将 PictureStream 转换为 HTML5 画布

    我正在从 net Web 服务检索图片流的字节数组 JSON 字节数组响应如下所示 137 80 78 372 617 more 我正在尝试转换这个字节数组并将其绘制到 HTML 画布中 如下所示 var context document
  • 无法获取长度

    我是 javascript 概念的新手 为什么我得到相同变量的不同输出length 当它在体内呈现出预期的效果时 var length element all by className className getText then func
  • async.js 和系列问题

    连接后尝试运行 fetch 提取比连接更快 并且在控制台中我收到提取错误 因为它返回结果的速度比连接完成的速度快 但在异步系列的文档中 有一个工具可以在第一个返回结果后运行第二个函数 Settimeouts 可以保存情况 但它并不美观 当一
  • Morph 目标为 Three.js

    我正在尝试开始使用变形目标和 Three js 然而 关于这个主题的文档似乎并不多 当我查看源代码时 morphTargetInfluences 似乎是有魔力 这是如何运作的 我该如何使用这个 值为1就是全力吗 如何区分同一模型上的不同变形
  • 如何使用 jquery/javascript 在 div 内进行选择

    有很多代码可以在页面中进行选择 但我想要一个代码来在 div 内进行选择 如果选择在我的 div 之外 该函数必须返回空字符串 有一个 jquery 插件仅适用于 textarea 而不适用于 div here http plugins j
  • html/javascript 链接到本地​​文件

    我正在尝试使用 JavaScript 显示本地文件的链接 但它不起作用 我不确定我做错了什么 html是
  • ReactJS 在打字时延迟 onChange

    我需要更改状态以维护用户正在输入的字符串 但是我想延迟操作直到用户停止打字 但我不太清楚如何做到这两点 因此 当用户停止打字时 我希望触发一个操作 但不是在此之前 有什么建议么 使用 React Hooks 和 Function 组件 要保
  • 由于请求的资源上不存在“Access-Control-Allow-Origin”标头,无法获取与 Axios 的链接请求

    我正在尝试使用 cryptocompare api 来获取 axios 的 coindata 列表 但我不知道如何解决这个问题 我相信这是一个 CORS 问题 但我不确定 完整错误如下 加载失败https www cryptocompare
  • 阻止 Android WebView 尝试在 loadData() 上加载/捕获 CSS 等资源

    背景 这似乎与许多其他问题重复 相信我 事实并非如此 我正在尝试将 html 数据加载到WebView https developer android com reference android webkit WebView html 能够
  • 使用 DataTables (Meteor Tabular) 在新行中绘制数组的每个元素

    我正在使用流星表格包 https atmospherejs com aldeed tabular aldeed tabular它实现了数据表 http datatables net 我正在尝试从 Mongo 集合创建一个表 该集合有一份以下
  • Javascript - 将类型化数组保存为 blob 并以二进制数据读回

    我有一个充满二进制数据的类型化数组 它是从 ArrayBuffer 生成的 var myArr new Uint8Array myBuffer 我将其呈现给用户 var blob new Blob myArr type octet stre
  • 类型“AngularFirestoreCollection”上不存在属性“onSnapshot”

    我正在尝试将侦听器与云 Firebase 分离 但仍然收到此错误 类型 AngularFirestoreCollection 上不存在属性 onSnapshot 你知道我应该进口什么吗 我直接从 Firebase 文档中复制此代码 let
  • 可可豆荚图表未出现(Swift 4)

    我的图表未使用此条形图显示任何条形 我已成功导入图表可可豆荚 目前没有运行时错误 图表中唯一显示的是描述标签 import UIKit import Charts class ViewController UIViewController
  • 如何更改 Dojo TabContainer 行为以仅打开外部链接而不是显示 ContentPane?

    我正在与一个TabContainer有几个不同的ContentPane孩子们 他们每个人都配备了href用于获取选择选项卡时显示的外部 AJAX 内容的参数 dojo addOnLoad function var tc nav new di
  • eslint/prettier 在 html 标签中添加不需要的空间

    我正在尝试向我的项目添加配置 以便代码自动格式化 我对 VS Code 中的用户设置进行了一些更新 还安装了 eslint 和 prettier 现在 每当我尝试保存我的代码时 都会从中得到改变 div div div div div di
  • Angular:DOM更新后调用方法

    我正在从 html 调用一个方法 调用休息服务 来增加 减少屏幕上的计数 现在我想调用另一个方法 即 getThreshold 来检查计数是否达到阈值 如果是 我想显示一条确认消息 我想首先更新屏幕上的计数 然后调用该函数来检查它是否达到阈

随机推荐