ChartJS:如何制作带有水平指南的条形图:

时间:2015-12-10 11:51:03

标签: javascript charts chart.js meteorcharts

是否可以制作如下例所示的图表?

Bar chart using chartjs with horizontal rule

我还没有找到一个带叠加层的例子。我在流星应用程序中的氛围插件的上下文中使用它,所以我可能无法轻松地将插件添加到我的chartjs实例中。

我已经建立了相当多的图表,所以出于这个原因,我强烈倾向于通过切换到另一个图表库来实现这一点,但现在还为时不晚如果没有别的方法可以解决这个问题,请将它们移除。

1 个答案:

答案 0 :(得分:1)

您可以扩展条形图以添加水平线

Chart.types.Bar.extend({
        name: "BarLine",
        draw: function () {

            Chart.types.Bar.prototype.draw.apply(this, arguments);

            var scale = this.scale,
                barHeight = this.scale.calculateY(83);


            // draw line
            this.chart.ctx.beginPath();
            this.chart.ctx.moveTo(30, barHeight);

            this.chart.ctx.strokeStyle = '#ff0000';
            this.chart.ctx.lineWidth = 3;
            this.chart.ctx.lineTo(this.chart.width, barHeight);
            this.chart.ctx.stroke();

            // write Label Text
            this.chart.ctx.fillStyle = '#000000';
            var text = this.options.labelText ? this.options.labelText : "DEFAULT TEXT" 
            this.chart.ctx.textAlign = 'center';
            this.chart.ctx.font = '22px Arial';
            this.chart.ctx.fillText(text, this.chart.width  * 0.5, 95);
            this.chart.ctx.closePath();                            

        }
    });`

你可以在绘图函数中添加条形值我确定,但我通常在图表的'onanimationcomplete'函数中进行,如下所示:

resultChart = new Chart(resultGraphCanvas.getContext("2d")).BarLine(chart, {

                        scaleBeginAtZero: true,
                        scaleOverride: true,
                        scaleSteps: 10,
                        scaleStepWidth: 10,
                        maintainAspectRatio: false,
                        labelText: "TEST DRAWN NEAR THE LINE",

                        showTooltips: false, //Needs to be set to false for the onAnimationComplete drawing to persist
                        onAnimationComplete: function () {


                            var ctx = this.chart.ctx;
                            ctx.font = this.scale.font;
                            ctx.fillStyle = this.scale.textColor
                            ctx.textAlign = "center";
                            ctx.textBaseline = "bottom";

                            this.datasets.forEach(function (dataset) {
                                dataset.bars.forEach(function (bar) {

                                    ctx.fillText(bar.value, bar.x, bar.y );
                                });
                            })
                        },
                    });

这会在条形图的顶部绘制值,我会将它们放在别处给你:)