【问题标题】:chart.js plugin for making waterfall charts用于制作瀑布图的 chart.js 插件
【发布时间】:2016-08-01 15:51:26
【问题描述】:

我想创建一个 chart.js 插件来创建瀑布图。

我是使用 chart.js 的新手。我正在考虑扩展条形图以创建瀑布图。

条形图控制器中的绘制函数如下:

draw: function(ease) {
            var me = this;
            var easingDecimal = ease || 1;
            helpers.each(me.getMeta().data, function(rectangle, index) {
                var d = me.getDataset().data[index];
                if (d !== null && d !== undefined && !isNaN(d)) {
                    rectangle.transition(easingDecimal).draw();
                }
            }, me);
        },

完整的条形图控制器 js 文件可以在这里找到: https://github.com/chartjs/Chart.js/tree/master/src/controllers

【问题讨论】:

  • 请发布您迄今为止尝试过的代码。 stackoverflow.com/help/how-to-ask
  • 我还没有开始创建插件。但我认为如果我们可以扩展条形图并将其转换为瀑布图,那就太好了。

标签: charts chart.js2


【解决方案1】:

由于Chart.js v2.9.0.,我们可以使用floating bars轻松创建瀑布图。此后,可以使用语法[min, max] 指定各个条形。

给定一个值数组[3, 5, 4, 2, 6],我们需要生成以下数据(最后一个条目是“总计”栏的计算值):

[[0, 3], [3, 8], [8, 12], [12, 14], [14, 20], 20]

剩下要做的唯一额外事情是定义一个tooltips.callback 函数,该函数计算要在工具提示中显示的正确值。

tooltips: {
  callbacks: {
    label: (tooltipItem, data) => {
      const v = data.datasets[0].data[tooltipItem.index];
      return Array.isArray(v) ? v[1] - v[0] : v;
    }
  }
},

请查看以下代码示例,该示例从baseData 数组中生成瀑布图。

let baseData = [
 { label: 'A', value: 3 }, 
 { label: 'B', value: 5 }, 
 { label: 'C', value: 4 },
 { label: 'D', value: 2 }, 
 { label: 'E', value: 6 }
];

const labels = baseData.map(o => o.label).concat('Total');
const data = [];
let total = 0;
for (let i = 0; i < baseData.length; i++) {
  const vStart = total;
  total += baseData[i].value;
  data.push([vStart, total]);  
}
data.push(total);
const backgroundColors = data.map((o, i) => 'rgba(255, 99, 132, ' + (i + (11 - data.length)) * 0.1 + ')');

new Chart('waterfall', {
  type: 'bar',
  data: {
    labels: labels,
    datasets: [{
      data: data,
      backgroundColor: backgroundColors,
      barPercentage: 1
    }]
  },
  options: {
    responsive: true,
    maintainAspectRatio: false,
    legend: {
      display: false
    },
    tooltips: {
      callbacks: {
        label: (tooltipItem, data) => {
          const v = data.datasets[0].data[tooltipItem.index];
          return Array.isArray(v) ? v[1] - v[0] : v;
        }
      }
    },
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="waterfall" height="200"></canvas>

如果图表应该以“总计”栏开头,只需使用reverselabelsdatabackgroundColors 数组,如下所示。

data: {
  labels: labels.reverse(),
  datasets: [{
    data: data.reverse(),
    backgroundColor: backgroundColors.reverse(),
    ...

【讨论】:

    【解决方案2】:

    我为瀑布图创建了一个 chartjs 插件。

    https://github.com/MartinDawson/chartjs-plugin-waterfall

    此插件通过检查您的任何数据集是否包含一个名为 dummyStack 的属性来工作,该属性设置为 true。 stack 属性必须与 dummyStack 结合使用,此插件才能正常工作。如果 dummyStack 为真,那么它会隐藏标签、工具提示并将颜色设置为不可见。当您使用堆叠时,它会产生如上图所示的浮动条的影响,我们可以将其用于瀑布图,因为 chartjs-2 默认不支持瀑布图。

    import waterFallPlugin from 'chartjs-plugin-waterfall';
    
    var chart = new Chart(ctx, {
        plugins: [waterFallPlugin]
    });
    
    const data = {
      datasets: [
        {
          label: 'Closing Costs',
          data: [50],
          backgroundColor: '#e8cdd7',
          stack: 'stack 1',
        },
        {
          label: 'Purchase Price',
          data: [700],
          backgroundColor: '#d29baf',
          stack: 'stack 1',
        },
        {
          data: [200],
          dummyStack: true,
          stack: 'stack 2',
        },
        {
          label: 'Opening Loan Balance',
          data: [550],
          backgroundColor: '#bb6987',
          stack: 'stack 2',
        },
        {
          label: 'Initial Cash Investment',
          data: [200],
          backgroundColor: '#a53860',
          stack: 'stack 3',
        },
      ],
    };
    

    它也有从小节到小节的线步。

    【讨论】:

    • 你知道如何使用这个插件在 x 轴上显示 tciks 吗?
    【解决方案3】:

    您可以使用 Chart.JS https://github.com/everestate/chartjs-plugin-waterfall (Ref: https://www.chartjs.org/docs/2.7.2/notes/extensions.html) 推荐的插件

    安装

    npm install --save chartjs-plugin-waterfall
    

    用法

    import waterFallPlugin from 'chartjs-plugin-waterfall';
    
    var chart = new Chart(ctx, {
        plugins: [waterFallPlugin]
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 2022-11-10
      相关资源
      最近更新 更多