【问题标题】:Overlay Line on chart.js Graphchart.js 图表上的叠加线
【发布时间】:2015-03-20 12:31:25
【问题描述】:

我想知道是否可以在 chart.js 图形(例如折线图)上叠加一条线?例如,在 x 轴上,一条水平线将在图上的值为 20 处绘制

【问题讨论】:

    标签: javascript chart.js


    【解决方案1】:

    我创建了一个称为叠加图表的东西,我已将它添加到我的 chart.js (https://github.com/leighquince/Chart.js) 分支中,可以在这种情况下使用。它的工作原理与折线图或条形图相同,唯一的区别是您声明了一个名为type 的额外属性,它可以是'line''bar'。然后只需拨打new Chart(ctx).Overlay(data)

    因此,对于您的示例,您可以只使用条形图,然后提供另一个数据集(比我使用的颜色更好)来显示线条。

    var data = {
      labels: ["January", "February", "March", "April", "May", "June", "July"],
      datasets: [{
        label: "My First dataset",
        //new option, barline will default to bar as that what is used to create the scale
        type: "line",
        fillColor: "rgba(220,220,220,0.2)",
        strokeColor: "rgba(0,0,0,0.6)",
        pointColor: "rgba(0,0,0,0.6)",
        pointStrokeColor: "#fff",
        pointHighlightFill: "#fff",
        pointHighlightStroke: "rgba(220,220,220,1)",
        datasetFill:false,
        data: [20, 20, 20, 20, 20, 20, 20]
      }, {
        label: "My First dataset",
        //new option, barline will default to bar as that what is used to create the scale
        type: "bar",
        fillColor: "rgba(220,20,220,0.2)",
        strokeColor: "rgba(220,20,220,1)",
        pointColor: "rgba(220,20,220,1)",
        pointStrokeColor: "#fff",
        pointHighlightFill: "#fff",
        pointHighlightStroke: "rgba(220,220,220,1)",
        data: [32, 25, 33, 88, 12, 92, 33]
      }]
    };
    var ctx = document.getElementById("canvas").getContext("2d");
    var chart = new Chart(ctx).Overlay(data, {
      responsive: false
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://raw.githack.com/leighquince/Chart.js/master/Chart.js"></script>
    
    <canvas id="canvas" width="400"></canvas>

    【讨论】:

    • 谢谢!正是我想要的。真的很感激。
    【解决方案2】:

    我需要类似的东西,但不是直线图形我需要的是一个真正的平的覆盖线。

    只是像这样扩展图表:

        Chart.types.Bar.extend({
            name: 'BarOverlay',
            draw: function (ease) {
                Chart.types.Bar.prototype.draw.apply(this);
                ctx.beginPath();
                ctx.lineWidth = 2;
                ctx.strokeStyle = 'rgba(255, 0, 0, 1.0)';
                ctx.moveTo(35, this.scale.calculateY(100));
                ctx.lineTo(this.scale.calculateX(this.datasets[0].bars.length), this.scale.calculateY(100));
                ctx.stroke();
            }
        });
    

    我的是硬编码以在“100”标记处画一条线(在本例中,我们正在查看目标为 100%)。

    然后这样称呼它:

    new Chart(ctx).BarOverlay(data, options);
    

    我还发现 Quince 的代码已过时,并且不知何故与 1.0.2 Chart.js 代码不兼容(渲染全部横向)。

    【讨论】:

      【解决方案3】:

      StrangeWill 的回答作为基础非常出色,但我需要条形图上的数据驱动垂直线,因此对其进行了如下修改:

      首先我在 options 数组中添加了一个属性(添加另一个数据集可能更简洁,但我不得不告诉 ChartJS 忽略它),其中每个选项都是我要突出显示的数据值索引,大致如下:

      ChartDefaults.verticalOverlayAtBar = [itemOne, itemTwo]
      ...
      var HistoryChart = new Chart(ctx).BarOverlay(ChartData, ChartDefaults);
      

      然后我修改了 StrangeWill 的代码,将其扩展为从上方迭代项目数组并在指示条上绘制垂直线。

      Chart.types.Bar.extend({
          name: 'BarOverlay',
          draw: function (ease) {
      
              // First draw the main chart
              Chart.types.Bar.prototype.draw.apply(this);
      
              var ctx = this.chart.ctx;
              var barWidth = this.scale.calculateBarWidth(this.datasets.length);
      
              for (var i = 0; i < this.options.verticalOverlayAtBar.length; ++i) {
      
                  var overlayBar = this.options.verticalOverlayAtBar[i];
      
                  // I'm hard-coding this to only work with the first dataset, and using a Y value that I know is maximum
                  var x = this.scale.calculateBarX(this.datasets.length, 0, overlayBar);
                  var y = this.scale.calculateY(2000);
      
                  var bar_base = this.scale.endPoint
      
                  ctx.beginPath();
                  ctx.lineWidth = 2;
                  ctx.strokeStyle = 'rgba(255, 0, 0, 1.0)';
                  ctx.moveTo(x, bar_base);
                  ctx.lineTo(x, y);
                  ctx.stroke();
              }
              ctx.closePath();
          }
      });
      

      这并不完美,因为我不熟悉 ChartJs 的内部代码,特别是我的行偏离了 2 个小节,尽管我怀疑这是数据数组中的栅栏错误,而不是图表计算。但是,希望这对其他人来说是一个有用的进步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多