当前位置: 首页 > 知识库问答 >
问题:

ChartJS水平图表在每个栏上显示图例

漆雕伟志
2023-03-14

我是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
                }]
            }
        }
    });

我试着加上

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);
                });
            })
        }

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

提前感谢!

共有1个答案

彭雨华
2023-03-14

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

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

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

只要把它放在你的animation.on完成属性中。

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示例(从您提供的示例中分叉)。

 类似资料:
  • 我是ChartJS的新手,我对这个传说有一些问题。我有一个简单的条形图,只有3条像: 但我显示的图表是空的:(我还尝试通过在画布下方添加另一个div来显示图例,并通过以下方式调用它: 同样的结果是:( 我做错了什么?

  • 我试图制作一个简单的水平堆叠条形图,并添加标签。我不确定我在这里做错了什么,任何意见都将不胜感激。 我可以通过降级到更低版本的chart.js和datalabel插件来实现它。 这里有一个jsfiddle:https://jsfiddle.net/chrispret/szLgyu2j/24/ 还有一些测试代码...

  • 在highcharts中有没有一种方法,我们可以在图表中隐藏一个序列,但仍然显示在图例上? 或者,我们是否可以添加一个假想/伪图例项,但并不真实存在于图表中? 对于上下文:客户要求我们根据它们的类别为条形图着色(前10条应该是默认颜色深蓝色,接下来的2条是蓝色,最后3条是浅蓝色)。现在他们要求我们放3个图例:A组(前10小节),B组(后2小节),C组(后3小节)。B组和C组不需要点击,因为它们是虚

  • 我认为我的问题是一个已知的问题,每次我制作一个新的图表,并将鼠标悬停在画布上的一些点上,旧的图表总是会闪进闪出。这是我试图修复它的一个线程,但似乎没有任何效果。我试图重新添加画布,使用破坏,清除,如果语句应该清除它,但什么都没有。 这是我的代码: 我尝试添加

  • 我使用绘制图表。我有另一个要求,我需要显示两个图表水平。 我有什么办法可以把这两张图表做成单行吗? 编辑:实际上,我希望它像您的示例一样。为此,您使用了,但这里我使用的是。

  • 我正在尝试使用2.3.0绘制chart.js水平条形图- 但它只显示一个小节。我错过了什么?