javascript - ChartJS 水平图表在每个条形上显示图例

标签 javascript jquery html css chart.js

我对 ChartJS 还很陌生,我有一个水平条形图:

HTML

<canvas id="mybarChart"></canvas>

JavaScript:

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

    ctx.height = 300;

    var mybarChart = new Chart(ctx, {
        type: 'horizontalBar',
        responsive: true,
        data: data,
        options: {
            legend: {
                display: false
            },
            scales: {
                yAxes: [{
                    display: false,
                    ticks: {
                        beginAtZero: true
                    },
                    gridLines: {
                        color: "rgba(0, 0, 0, 0)",
                    }
                }],
                xAxes: [{
                    display: false,
                    gridLines: {
                        color: "rgba(0, 0, 0, 0)",
                    },
                    barPercentage: 0.5,
                    categoryPercentage: 0.5
                }]
            }
        }
    });

为此,我尝试在每个栏上添加图例,例如 this但现在看起来像 this

我尝试添加

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.points.forEach(function (points) {
                    ctx.fillText(points.value, points.x, points.y - 10);
                });
            })
        }

但结果还是一样。我究竟做错了什么? 我发现了一些东西here但每个条形上显示的标签是 Y 轴的刻度。 是否可以在每个栏上添加图例并保留工具提示?

提前致谢!

最佳答案

实际上有多种方法可以实现这一目标。为简单起见,我将仅修改您提供的示例。

请记住,这会将标签放在栏内。您可以轻松修改它以将其放置在外部,但您必须添加逻辑以确保不会溢出图表顶部或溢出到其他条形中(不是非常简单的逻辑)。

此外,此方法要求您为每个数据集配置一个标签(无论如何,这都是驱动常规图例所必需的)。

只需将其放入您的 animation.onComplete 属性中即可。

function() {
  var ctx = this.chart.ctx;
  ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
  ctx.textAlign = 'left';
  ctx.textBaseline = 'bottom';

  this.data.datasets.forEach(function(dataset) {
    for (var i = 0; i < dataset.data.length; i++) {
      var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
          scale_max = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._yScale.maxHeight;
      left = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._xScale.left;
      offset = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._xScale.longestLabelWidth;
      ctx.fillStyle = '#444';
      var y_pos = model.y - 5;
      var label = model.label;
      // Make sure data value does not get overflown and hidden
      // when the bar's value is too close to max value of scale
      // Note: The y value is reverse, it counts from top down
      if ((scale_max - model.y) / scale_max >= 0.93)
        y_pos = model.y + 20;
      // ctx.fillText(dataset.data[i], model.x, y_pos);

      if (dataset.data[i] > 0) {
        ctx.fillText(dataset.label, left + 10, model.y + 8);
      }
    }
  });
}

这是一个jsfiddle example (从您提供的示例中 fork 出来)。

关于javascript - ChartJS 水平图表在每个条形上显示图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817560/

相关文章:

javascript - "EMALFORMED Failed to read bower.json"上 "bower install requirejs-text"

css - 如何让一个 div 排在另一个 div 的右边而不是下面?

HTML 网页在台式机和平板电脑上显示良好,但在手机上显示不佳

javascript - 使用 jquery 添加多文本字段

javascript - 如何在Restangular中添加多个Auth Interceptor?

javascript - 了解 jquery 开/关功能的区别

javascript - 如何从 Bootstrap-3-Typeahead 返回的结果中删除重复项?

javascript - JS/JQUERY 不更新字符串数组值

javascript - 如何为 wordpress 创建一个像 SMINT 这样的粘性导航?

javascript - PhoneGap 尝试上传音频媒体文件 - iOS 正常,Android 找不到文件