【问题标题】:Chart.js always visible labelsChart.js 始终可见标签
【发布时间】:2015-08-04 09:27:00
【问题描述】:

我正在为客户重新设计一个应用程序,他们想要显示一个图表。他们目前使用基础设施图表,他们很想停止使用它,但布局必须保持不变。

这是他们想要的布局(所以标签应该是可见的,单独的条,...)

所以我的第一个选择是尝试 Chart.js,但我只能得到这样的东西:

所以基本上唯一需要做的就是始终显示标签。

数据是通过角度提供的,如果是整数,则只是一个数组。对图表使用以下指令:http://jtblin.github.io/angular-chart.js/

我当前的html:

<canvas id="polar" class="chart chart-polar-area" data="data.values" labels="data.labels" width="200" height="200"
        options="{animateRotate: false}"></canvas>

我找到了这个; How to add label in chart.js for pie chart 但我无法让它工作

【问题讨论】:

标签: javascript angularjs charts chart.js


【解决方案1】:

基于ChartJS: Change the positions of the tooltips


预览


将上述转换为角度图很容易,因为我们只设置选项。但是我们需要做 2 个小改动(即从 this 设置图表和 ctx 变量

// THIS IS REQUIRED AND WAS ADDED
tooltipEvents: [],
onAnimationComplete: function () {
    // THESE 2 LINES ARE NEW
    var chart = this.chart;
    var ctx = this.chart.ctx;

    this.segments.forEach(function (segment) {
        var outerEdge = Chart.Arc.prototype.tooltipPosition.apply({
            // THESE 2 LINES WERE CHANGED
            x: chart.width / 2,
            y: chart.height / 2,
            startAngle: segment.startAngle,
            endAngle: segment.endAngle,
            outerRadius: segment.outerRadius * 2 + 10,
            innerRadius: 0
        })
    ...

假设您包含库脚本,整个代码看起来像这样

HTML

<div ng-app="myApp">
    <div ng-controller="myController">
        <canvas id="polar-area" class="chart chart-polar-area" data="data" labels="labels" options="options"></canvas>
    </div>
</div>

脚本

angular.module('myApp', ["chart.js"]);
angular.module('myApp').controller('myController', function ($scope) {
        $scope.labels = ["Download Sales", "In-Store Sales", "Mail-Order Sales", "Tele Sales", "Corporate Sales"];
        $scope.data = [300, 500, 100, 40, 120];
        $scope.options = {
            scaleOverride: true,
            scaleStartValue: 0,
            scaleStepWidth: 40,
            scaleSteps: 10,
            tooltipEvents: [],
            onAnimationComplete: function () {
                var chart = this.chart;
                var ctx = this.chart.ctx;

                this.segments.forEach(function (segment) {
                    var outerEdge = Chart.Arc.prototype.tooltipPosition.apply({
                        x: chart.width / 2,
                        y: chart.height / 2,
                        startAngle: segment.startAngle,
                        endAngle: segment.endAngle,
                        outerRadius: segment.outerRadius * 2 + 10,
                        innerRadius: 0
                    })

                    var normalizedAngle = (segment.startAngle + segment.endAngle) / 2;
                    while (normalizedAngle > 2 * Math.PI) {
                        normalizedAngle -= (2 * Math.PI)
                    }

                    if (normalizedAngle < (Math.PI * 0.4) || (normalizedAngle > Math.PI * 1.5))
                        ctx.textAlign = "start";
                    else if (normalizedAngle > (Math.PI * 0.4) && (normalizedAngle < Math.PI * 0.6)) {
                        outerEdge.y += 5;
                        ctx.textAlign = "center";
                    }
                    else if (normalizedAngle > (Math.PI * 1.4) && (normalizedAngle < Math.PI * 1.6)) {
                        outerEdge.y - 5;
                        ctx.textAlign = "center";
                    }
                    else
                        ctx.textAlign = "end";

                    ctx.fillText(segment.label, outerEdge.x, outerEdge.y);
                })
            }
        }
    }
);

小提琴 - http://jsfiddle.net/tmzpy7Lt/

【讨论】:

  • 太好了!一个小问题,是否可以保留标签?因为当我悬停它时,它们就会消失
  • @Kiwi - 哎呀。我错过了设置工具提示事件。已经更新了答案和小提琴。
  • 不错!我现在是否正在尝试获取分段线,并且还试图弄清楚它不会切断顶部标签,目前我有这个; jsfiddle.net/etLrhukn/2
  • 一个 hacky 的方法是增加 1 的尺度步数并减少一点外半径。 jsfiddle.net/mnqLzp7y。对于这些段,我想您可以(错误地)再次使用 tooltipPosition 函数,将 startAngle 和 endAngle 减少/增加它们之间角度的一半以获得每个扇区的边缘,然后使用 ctx 绘制线条。
  • 是的,我在做(误)使用,如果可以的话,看看这个,我在画布上添加了一些宽度和高度,然后发生以下情况:jsfiddle.net/mnqLzp7y/1跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多